A ordem do índice é importante quando suas condições de consulta se aplicam apenas a PART do índice. Considerar:
-
SELECT * FROM table WHERE first_name="john" AND last_name="doe"
-
SELECT * FROM table WHERE first_name="john"
-
SELECT * FROM table WHERE last_name="doe"
Se o seu índice for (
first_name
, last_name
) as consultas 1 e 2 irão usá-lo, a consulta nº 3 não.Se seu índice for (last_name
, first_name
) as consultas 1 e 3 irão usá-lo, a consulta #2 não. Alterar a ordem de condição na cláusula WHERE não tem efeito em nenhum dos casos. Os detalhes estão aqui
Atualizar :
Caso o acima não esteja claro - o MySQL só pode usar um índice se as colunas nas condições de consulta formarem um prefixo mais à esquerda do índice. A consulta #2 acima não pode usar (
last_name
, first_name
) porque é baseado apenas em first_name
e first_name
NÃO é o prefixo mais à esquerda do (last_name
, first_name
) índice. A ordem das condições DENTRO da consulta não importa; a consulta nº 1 acima poderá usar (
last_name
, first_name
) indexa muito bem porque suas condições são first_name
e last_name
e, juntos, eles formam um prefixo mais à esquerda de (last_name
, first_name
) índice.