Estou utilizando um sistema de monitoramento de banco de dados que, entre outros dados, mostra os seguintes valores para consultas SELECT:
- número de junções que usam intervalos na primeira tabela
- número de junções que fazem uma varredura completa da primeira tabela
- número de junções sem chaves que verificam o uso da chave após cada linha
- número de junções que executam varreduras de tabela porque não usam índices
- número de junções que usam uma pesquisa de intervalo em uma tabela de referência
Dessas consultas, quais são as de menor desempenho e, portanto, devem ser otimizadas primeiro? Eu diria os números 2 e 4 em ordem de importância, mas também gostaria de ouvir comentários sobre os outros tipos.
Esse sistema de monitoramento mostra também o número total de consultas SELECT como a soma desses cinco valores. Esses são todos os casos possíveis e mutuamente exclusivos para um SELECT?
Não estou falando de uma consulta específica (que posso encontrar no log de consultas lentas); Estou mais interessado no tipo de consulta entre esses 5 listados acima. Por exemplo, varreduras completas de tabelas geralmente são ruins (a menos que estejamos trabalhando em tabelas pequenas, caso em que não nos importaremos com a otimização).
Minha outra dúvida era se esses tipos podem estar se sobrepondo, pois o sistema de monitoramento mostra um 6º valor que é a soma desses cinco, e isso não faz sentido se os tipos não forem mutuamente exclusivos (como suspeitamos).
Nenhuma das acima.
Uma "varredura completa" é irrelevante se a tabela tiver apenas 10 linhas. O mesmo vale para "não usar um índice".
Existem muitas consultas para as quais nenhum índice é útil; suas estatísticas farão com que você tropece nelas. Por exemplo, se você indexar um 'sinalizador' (sim/não, M/F, etc.), o otimizador geralmente evitará o índice e simplesmente examinará a tabela -- porque é mais eficiente fazer isso.
"Primeira mesa". A menos que você esteja olhando para o
EXPLAIN
, é difícil prever qual tabela será vista "primeiro". Mesmo a existência deLEFT
não prediz conclusivamente a ordem das tabelas.Qual é o seu objetivo, afinal? O objetivo principal, na minha opinião, é encontrar e corrigir consultas que estão atrapalhando o sistema. Para tanto, desejo uma lista de consultas, ordenadas pelo tempo total decorrido (número de ocorrências vezes tempo médio). Um que é fornecido com muita eficiência por
Em seguida, obtenho
EXPLAIN
eSHOW CREATE TABLE
para as primeiras consultas e trabalho nelas.Se você quiser ver a 'mudança ao longo do tempo', registre o 'tempo total' para as piores consultas e veja se elas ficam melhores ou piores no próximo mês.
Você pode descobrir que algumas das piores consultas não são
SELECTs
.