Banco de dúvidas

Otimizando consultas com o Explain do MySQL

A diretiva "explain" do MySQL é uma ferramenta muito útil para otimizar consultas ao banco de dados. Ele mostra como o otimizador do MySQL executou a consulta, permitindo que ela talvez possa ter seu desempenho melhorado reduzindo seu tempo e a memória usada.

Por exemplo, num banco de dados qualquer há duas tabelas, "clientes" e "pedidos":

Clientes

Pedidos

A tabela de clientes tem 2000 registros, e a de pedidos, 500 mil.

Digamos que precise fazer uma consulta com junção entre essas duas tabelas, pelo id do cliente:

select * from clientes, pedidos
where clientes.id=pedidos.id_cliente and clientes.id='23';

Descobrimos que a consulta está levando alguns segundos para ser executada e precisamos saber como melhorar isso. Vamos então usar o explain, bastando inseri-lo no início da consulta:

explain select * from clientes, pedidos
where clientes.id=pedidos.id_cliente and clientes.id='23';

O MySQL vai retornar o seguinte:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE clientes NULL const PRIMARY PRIMARY 4 const 1 100.00 NULL
1 SIMPLE pedidos NULL ALL NULL NULL NULL NULL 500000 10.00 Using where

Veja o valor de "rows" da tabela "pedidos": 500 mil! Isso quer dizer que o MySQL teve que pesquisar todos os registros da tabela pedidos para fazer a junção das tabelas. Repare também que o valor de "possible_keys" e "key" é nulo, ou seja, o MySQL não usou índices na pesquisa.

Vamos então criar um índice na coluna "id_cliente" da tabela "pedidos". Veja mais sobre como criar índices.

alter table pedidos add index (id_cliente);

Agora vamos refazer o explain na mesma consulta:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE clientes NULL const PRIMARY PRIMARY 4 const 1 100.00 NULL
1 SIMPLE pedidos NULL ref id_cliente id_cliente 4 const 15 100.00 Using index condition

Veja que o MySQL só fez 16 acessos à tabela no total! Muito melhor que 500 mil e 1. A consulta agora leva milissegundos para ser feita e consome muito menos memória.

Este artigo foi útil para você?