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.