Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Indexação correta ao usar o operador OR


Você não entende como os índices funcionam.

Pense em uma lista telefônica (o equivalente a um índice de duas colunas no sobrenome primeiro, primeiro nome no último). Se eu lhe pedir para encontrar todas as pessoas na lista telefônica cujo sobrenome seja "Smith", você pode se beneficiar do fato de que os nomes estão ordenados dessa maneira; você pode supor que os Smiths estão organizados juntos. Mas se eu lhe pedir para encontrar todas as pessoas cujo primeiro nome é "John", você não obterá nenhum benefício do índice. Johns pode ter qualquer sobrenome, e por isso eles estão espalhados pelo livro e você acaba tendo que pesquisar da maneira mais difícil, de capa a capa.

Agora, se eu lhe pedir para encontrar todas as pessoas cujo sobrenome seja "Smith" OU cujo primeiro nome seja "John", você poderá encontrar os Smiths facilmente como antes, mas isso não o ajudará em nada a encontrar os Johns. Eles ainda estão espalhados pelo livro e você tem que procurá-los da maneira mais difícil.

É o mesmo com índices de várias colunas no SQL. O índice é classificado pela primeira coluna, depois classificado pela segunda coluna em casos de empate na primeira coluna, depois classificado pela terceira coluna em casos de empate nas duas primeiras colunas etc. Não é classificado por todas as colunas simultaneamente. Portanto, seu índice de várias colunas não ajuda a tornar seus termos de pesquisa mais eficientes, exceto a coluna mais à esquerda no índice.

Voltando à sua pergunta original.

Crie um índice de coluna única separado em cada coluna. Um desses índices será uma escolha melhor do que os outros, com base no estimativa de quantas operações de E/S o índice incorrerá se for usado.

As versões modernas do MySQL também têm alguns conhecimentos sobre fusão de índice , então a consulta pode use mais de um índice em uma determinada tabela e tente mesclar os resultados. Caso contrário, o MySQL tende a ser limitado a usar um índice por tabela em uma determinada consulta.

Outro truque que muitas pessoas usam com sucesso é fazer uma consulta separada para cada uma de suas colunas indexadas (que deve usar o respectivo índice) e depois UNION os resultados.
SELECT fields FROM table WHERE field1='something' 
UNION
SELECT fields FROM table WHERE field2='something' 
UNION
SELECT fields FROM table WHERE field3='something' 
UNION
SELECT fields FROM table WHERE field4='something' 

Uma observação final:se você estiver procurando pelo mesmo 'something' em quatro campos, você deve reconsiderar se todos os quatro campos são realmente a mesma coisa, e você é culpado de criar uma tabela que viola a primeira forma normal com grupos repetidos . Em caso afirmativo, talvez field1 a field4 pertençam a uma única coluna em uma tabela filha. Então fica muito mais fácil indexar e consultar:
SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'