Licao 10.3 · Tempo de leitura: ~9 min
Esta licao apresenta ferramentas praticas para analise e otimizacao de consultas SQL. Voce vai aprender como o banco "le" sua consulta, o que e um plano de execucao e como encontrar gargalos. Vamos usar EXPLAIN e interpretar os campos mais importantes. Ao final, voce conseguira diagnosticar com seguranca por que uma consulta esta lenta.
Na licao anterior, vimos principios para escrever SQL eficiente. Mas e se a consulta continuar lenta? Em vez de adivinhar, precisamos analisar. Sempre que uma consulta e executada, o otimizador do SGBD monta um plano de execucao.
Entender esse plano e a chave para uma otimizacao mais profunda. Nesta licao, vamos olhar para dentro do mecanismo do banco usando a principal ferramenta de diagnostico: o plano de execucao.
Plano de execucao e um conjunto detalhado de etapas que o SGBD prepara para executar uma consulta SQL. Ele descreve:
cost) das operacoes.EXPLAINNos principais SGBDs relacionais (MySQL, PostgreSQL, MariaDB), a principal ferramenta de analise e EXPLAIN.
Basta adicionar EXPLAIN antes da consulta:
EXPLAIN
SELECT customer_id, first_name, last_name
FROM customer
WHERE active = 1;
Resultado: o SGBD retorna uma tabela em que cada linha representa uma etapa de execucao.
type ou access_type)Esse campo mostra como as linhas sao buscadas:
const / eq_ref: excelente.ref: muito bom.range: bom.index: mediano.ALL: arriscado em tabelas grandes (varredura completa).key / possible_keys)Mostra qual indice o otimizador escolheu. Se key for NULL, nenhum indice adequado foi usado.
rows)E a estimativa de linhas que o SGBD precisa examinar. Quanto menor, menor tende a ser o trabalho.
Suponha a consulta abaixo:
EXPLAIN
SELECT *
FROM payment
WHERE payment_date = '2005-05-25 11:30:37';
Se type mostrar ALL e key mostrar NULL, o indice por data esta ausente ou nao esta sendo usado.
Direcao de correcao:
O passo mais comum e criar indice na coluna usada no WHERE. Na proxima licao veremos indices em detalhe, mas e o EXPLAIN que evidencia a necessidade.
JOIN pode gerar plano melhor.DISTINCT e ORDER BY desnecessarios podem bloquear melhorias do otimizador.Principais conclusoes desta licao:
EXPLAIN para ver como os dados sao acessados de fato.ALL (Full Table Scan) em tabelas grandes.rows ajuda a estimar a carga de processamento.key for NULL, revise indices e predicados SARGable.EXPLAIN se a consulta ja esta rapida?Porque ele mostra riscos antes de o volume de dados crescer. Uma consulta aceitavel hoje pode degradar bastante depois.
Em tabelas grandes, ALL costuma ser sinal de alerta por indicar varredura completa.
rows e tao importante?rows estima quanto trabalho o SGBD espera fazer. Valores altos normalmente apontam por onde comecar a otimizacao.
E a estrategia montada pelo otimizador do SGBD para produzir o resultado. Mostra ordem de operacoes, metodos de acesso e custos estimados.
Comeco por type/access_type, key/possible_keys e rows. Esses campos revelam rapidamente uso de indice e possiveis gargalos.
Se key aparece como NULL com frequencia e o acesso indica varredura, vale revisar indexacao nas colunas de WHERE e JOIN.
Na proxima licao, vamos para o recurso mais poderoso de aceleracao: indices.