Ordenar por coluna deve ter índice ou não?

35

Eu adicionei índices à tabela que são usados ​​para pesquisar resultados. Estou mostrando resultados por ordem ASC ou DESC. Então essa coluna deve ter índice ou não? Eu tenho mais 2 índices nessa tabela. Como o desempenho afetará criando ou não o índice para essa coluna?

Somnath Muluk
fonte
2
Por favor, poste a consulta
RolandoMySQLDBA

Respostas:

26

Sim, o MySQL pode usar um índice nas colunas em ORDER BY (sob certas condições). No entanto, o MySQL não pode usar um índice para ordem ASC e DESC mista por ( SELECT * FROM foo ORDER BY bar ASC, pants DESC). Compartilhar sua consulta e a instrução CREATE TABLE nos ajudaria a responder sua pergunta mais especificamente.

Para obter dicas sobre como otimizar as cláusulas ORDER BY: http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

Editar 2012-01-21 8:53 AM

Havia perguntas sobre a fonte da minha declaração sobre o uso de um índice com ASC / DESC misto no ORDER BY. Na documentação ORDER BY Optimization :

Em alguns casos, o MySQL não pode usar índices para resolver a ORDER BY, embora ainda use índices para encontrar as linhas que correspondem à cláusula WHERE. Esses casos incluem o seguinte:

...

Você mistura ASC e DESC:

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

...

Além disso, a palavra-chave DESC não tem sentido em CREATE INDEX

Uma especificação index_col_name pode terminar com ASC ou DESC. Essas palavras-chave são permitidas para futuras extensões para especificar o armazenamento do valor do índice crescente ou decrescente. Atualmente, eles são analisados, mas ignorados; valores de índice são sempre armazenados em ordem crescente.

Aaron Brown
fonte
3
"O MySQL não pode usar um índice para ASC misto, DESC" . Referência para isso?
precisa saber é o seguinte
CREATE INDEX idx_foo ON foo(bar ASC, pants DESC);Deveria trabalhar.
precisa saber é o seguinte
Minha fonte é a documentação do mysql vinculada na minha resposta. Procure por "mix".
Aaron Brown
3
O MySQL analisa asc & Desc em CREATE INDEX, mas os ignora. Os índices são sempre armazenados em ordem crescente. dev.mysql.com/doc/refman/5.5/en/create-index.html
Aaron Brown
1
Novo com MySQL 8.0 : Agora é possível utilizar uma mistura de ASCe DESC se a INDEXtem a mesma mistura.
Rick James
4

Para quem quer saber a resposta no PostgreSQL, a resposta é sim, um índice será usado. De acordo com a documentação do PostgreSQL, o planejador de consultas "considerará a satisfação de uma especificação ORDER BY, digitalizando um índice disponível que corresponda à especificação ou digitalizando a tabela em ordem física e fazendo uma classificação explícita". Isso significa que, se houver um índice que o planejador possa usar, o fará, voltando a fazer uma classificação após recuperar as linhas correspondentes.

douglasr
fonte