Consulta Caso A :
WHERE thread_id = 12345
AND placeholder = FALSE
ORDER BY some_column DESC
LIMIT 20
Índice:
(thread_id, date_created)
Plano:
Index is used
Using Where
Using filesort
Não tem problema, certo? Se o índice for usado (para corresponder parcialmente à WHERE
condição), ainda precisamos de uma operação de classificação para ordenar os resultados por some_column
(que não está no índice). Também precisamos de uma verificação extra (Usando Onde) para manter também apenas as linhas que correspondem à 2ª condição. ESTÁ BEM.
Caso B (a pergunta)
Consulta:
WHERE thread_id = 12345
AND placeholder = FALSE
ORDER BY date_created DESC
LIMIT 20
Índice:
(thread_id, date_created)
Plano:
Index is used
Using Where
-- no "Using filesort"
Então, por que não precisa de uma classificação aqui ? Porque o índice é suficiente para classificar como a consulta deseja. Obviamente, existe o problema adicional da condição extra ( AND placeholder = FALSE
) que não é coberta pelo índice.
OK, mas realmente não precisamos de um tipo aqui. O índice pode nos fornecer resultados que correspondem à primeira condição ( WHERE thread_id = 12345
) e estão na ordem desejada para saída. A única verificação adicional de que precisamos - e o que o plano faz - é obter as linhas da tabela, na ordem fornecida pelo índice, e verificar essa segunda condição até obtermos 20 correspondências. É isso que significa "Usando Onde" ".
Podemos obter as 20 partidas nas primeiras 20 linhas (muito boas e rápidas) ou nas 100 primeiras (ainda é provável que seja suficientemente rápida) ou nos primeiros 1000000 (provavelmente muito, muito lentas) ou podemos obter apenas 19 partidas da tabela mesmo depois de ler todas as linhas correspondentes do índice (realmente muito lento em uma tabela grande). Tudo depende da distribuição dos dados.
Processo C (mesmo plano melhor)
Consulta:
WHERE thread_id = 12345
AND placeholder = FALSE
ORDER BY date_created DESC
LIMIT 20
Índice:
(placeholder, thread_id, date_created)
Plano:
Index is used
-- no "Using Where"
-- no "Using filesort"
Agora, nosso índice corresponde às condições e à ordem de. O plano é bem simples: obtenha as primeiras * 20 correspondências do índice e leia as linhas correspondentes da tabela. Nenhuma verificação extra (Não "Usando Onde") e nenhuma classificação (não "Usando arquivosort") é necessária.
first *: os 20 primeiros ao ler o índice de trás para frente a partir do final (como temos ORDER BY .. DESC
), mas isso não é um problema. Os índices da árvore B podem ser lidos para frente e para trás com desempenho quase igual.