Como posso saber se um índice está sendo usado para classificar no MySQL?

10

Eu tenho uma consulta com uma cláusula ORDER BY que usa uma coluna que é a última coluna em um índice que está sendo usado na cláusula WHERE, essencialmente do formulário:

SELECT
  cols
FROM
  tables
WHERE
  col_1 = x
  AND col_2 = y
  AND col_3 = z
ORDER BY col_4

e o índice é criado nas colunas (col_1, col_2, col_3, col_4) nessa ordem.

Quando eu perfil a consulta, mais de 99% do tempo é gasto no estado "Resultado da classificação". col_4 é uma coluna de carimbo de data / hora, se isso faz alguma diferença. Entendo que ORDER BY só pode usar um índice em determinadas circunstâncias, mas ainda estou um pouco confuso quanto ao momento exato em que o otimizador o faria.

Chris Cooper
fonte

Respostas:

13

Você deve anexar EXPLAIN EXTENDEDantes da consulta e ver o resultado você mesmo.

Deve ter uma entrada para

  • possible_keys

Se esta coluna for NULL, não há índices relevantes. Nesse caso, você poderá melhorar o desempenho de sua consulta examinando a cláusula WHERE para verificar se ela se refere a alguma coluna ou colunas que seriam adequadas para indexação.

e

  • Chaves

A coluna chave indica a chave (índice) que o MySQL realmente decidiu usar. Se o MySQL decidir usar um dos índices possible_keys para procurar linhas, esse índice será listado como o valor da chave.

Para obter mais informações, consulte a saída Explain e Explain join_types

Mahesh Patil
fonte
Entendo, minha pergunta especificamente, tem a ver com a cláusula ORDER BY. Minha consulta está usando o índice especificado para restringir as linhas retornadas, mas, considerando o desempenho da classificação, acho que não está sendo usado para a cláusula ORDER BY.
Chris Cooper
11
Em alguns casos, o MySQL pode usar um índice para satisfazer uma cláusula ORDER BY sem fazer nenhuma classificação extra. O índice também pode ser usado mesmo se o ORDER BY não corresponder exatamente ao índice, desde que todas as partes não utilizadas do índice e todas as colunas ORDER BY extras sejam constantes na cláusula WHERE. As consultas a seguir usar o índice para resolver o ORDER BY parte enviamos esta dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Mahesh Patil
1

Você usa EXPLAINna sua consulta ( explain select-or-whatever-your-query-is).

possible_keysmostre os que poderiam ser usados, keyaquele realmente usado.

sjas
fonte
11
Para adicionar a isso: explain format=json select ...é ainda mais poderoso. Inclui used_key_parts, que informa se uma chave composta foi usada parcial ou totalmente, e index_conditioninforma qual parte da consulta é responsável por qual índice.
okdewit