Saber id
é a chave primária...
Digamos que temos um índice no MySQL como
account_id / assignee_id / is_public
mas a classificação de uma consulta que precisa desse índice é por id
(o índice primário)
alterando o índice para
account_id / assignee_id / is_public / id
é mais fácil no DB. Correto ou incorreto?
Se sim, onde você vê isso nos documentos?
A consulta tem account_id
, assignee_id
, is_public
na WHERE
cláusula, então ordenando por id
. Mas a coluna para a classificação é id
a chave primária no BD e, portanto, o MySQL mantém a chave primária em ordem por padrão.
Uma consulta com uma cláusula WHERE como esta:
Seria benéfico ter um índice definido em colunas
(account_id, assignee_id, is_public, id)
.https://dev.mysql.com/doc/refman/en/innodb-index-types.html diz:
Se você definir a tabela usando o mecanismo de armazenamento InnoDB (que tem sido o mecanismo de armazenamento padrão no MySQL por anos), então a coluna de chave primária é implicitamente anexada ao índice. Então um índice em
(account_id, assignee_id, is_public)
é na verdade um índice em(account_id, assignee_id, is_public, id)
sem que você o especifique.Isso não é necessariamente verdade se você usar um mecanismo de armazenamento diferente (você deve ter um bom motivo para fazer isso).
Se qualquer uma das condições na cláusula WHERE não estiver usando
=
, então as regras mudam. Ou seja, se você usar qualquer desigualdade ou comparação de intervalo, então a otimização de classificação por chave primária do índice não funciona, e o MySQL tem que classificar o resultado manualmente.Leia mais sobre como o MySQL otimiza ORDER BY aqui: https://dev.mysql.com/doc/refman/en/order-by-optimization.html
Você deve usar EXPLAIN para analisar como o MySQL planeja usar índices para sua consulta.
Você pode gostar da minha apresentação Como projetar índices, realmente , ou do vídeo em que a apresento: https://www.youtube.com/watch?v=ELR7-RdU9XU