A replicação baseada em declarações é a mais rápida e mais compacta, mas em algumas circunstâncias pode produzir resultados diferentes (não determinísticos) em escravos do que no mestre, resultando em inconsistência. Um exemplo pode ser:
UPDATE mytable SET a = a + 1 LIMIT 1;
Não há como garantir qual linha será atualizada, pois não há ordem de classificação e a ordem no disco não é previsível nem consistente.
A replicação baseada em linha evita esse problema replicando os dados alterados em vez das consultas, mas considerando uma declaração como:
UPDATE mytable SET a = a + 1;
requer a replicação de apenas alguns bytes para a replicação baseada em instruções, independentemente de quantas linhas ela afetar: se atualizar 1 milhão de linhas, a replicação baseada em linha replicará todas as 1 milhão de linhas, o que será muito mais lento e criará binário muito maior registros.
O modo misto alterna entre os dois, usando o que for mais eficiente ou seguro (por exemplo, inserções simples provavelmente são feitas da melhor maneira pela replicação baseada em linha - o uso de instruções pode ser mais lento). A oportunidade para problemas vem em reconhecer quais afirmações são não-determinísticas, o que é um problema não trivial.
Em resumo:
- Baseado em linha: sempre seguro, possivelmente muito lento e ineficiente em tempo e espaço
- Baseado em declarações: nem sempre é seguro, mas pode ser muito mais rápido
- Modo misto: o melhor dos dois mundos, em teoria, mas que poderia dar errado, resultando em desempenho lento ou em dados errados, dependendo de como ele se engana!
Os documentos oficiais são aqui .
Esta é também uma questão antiga: você deve estar usando o MySQL 5.5 para qualquer nova compilação agora. Eu prefiro as construções de Percona.