Banco de dúvidas

Acelerando consultas no MySQL com índices

É possível acelerar MUITO algumas consultas ao banco de dados com o uso de índices. Por exemplo, vejamos uma tabela de clientes:

create table clientes (
   codigo int(11) not null auto_increment,
   nome varchar(100) not null,
   email varchar(100) not null,
   telefone varchar(100) not null,
   primary key (codigo)
);

A tabela tem chave primária ("primary key") na coluna "codigo". Mas suponhamos que você faça uma consulta pelo e-mail do cliente:

select * from clientes where email="fulano@dominioqualquer.com.br";

Se a tabela tiver poucas entradas, isso não tem problema. Mas quando começa a ter por volta de milhares ou centenas de milhares de registros, essa consulta pode passar a levar vários segundos, senão minutos, pois o MySQL terá que procurar linha por linha da tabela. É aí que a criação de um índice pode ser muito útil.

Veja que uma consulta onde tem join de duas ou mais tabelas também pode se beneficiar de um índice. Por exemplo:

select * from clientes, pedidos where clientes.codigo=pedidos.codigo_cliente;

Nesse caso, a consulta pode ser acelerada criando-se um índice na coluna "codigo_cliente" da tabela "pedidos", pois ela é usada nessa junção de tabelas.

O que é um índice?

De forma simplificada, um índice reúne os valores de uma coluna em ordem alfabética (ou numérica) para que o MySQL possa encontrar um valor determinado mais rapidamente, em vez de procurar linha por linha. É como fazer uma pesquisa em uma lista telefônica página por página! Acredite, uma consulta como do exemplo acima, que levaria vários segundos numa tabela grande, pode passar a ser quase instantânea com o uso de um índice!

Como criar um índice

Use o seguinte comando:

alter table clientes add index (email);

Isso vai criar um índice na coluna "email". Realize aquela consulta demorada novamente e veja se não está bem mais rápida!

Duas ou mais colunas

Se você costuma pesquisar a tabela por duas ou mais colunas ao mesmo tempo,

select * from clientes where email="fulano@dominioqualquer.com.br"
   and telefone="(21) 2555-1234";

você pode indexá-las usando um só índice, assim:

alter table clientes add index indice1 (email, telefone);

onde "indice1" é o nome do índice (pode ser qualquer nome), que é necessário informar no caso de múltiplas colunas.

A ordem importa

PORÉM, perceba que a ordem das colunas no índice importa! Se você TAMBÉM fizer consultas com uma das colunas apenas, ela deve ser a primeira do seu índice múltiplo.

Por exemplo, dado um índice como o do exemplo acima, que incorpora as colunas "email" e "telefone", mas seu script faz consultas também pelo telefone somente, esta coluna deve ficar em primeiro lugar na hora de criar o índice, ou o MySQL não poderá acelerar a consulta:

alter table clientes add index indice1 (telefone, email);

Uma outra opção é criar um outro índice apenas para a coluna "telefone".

Acelerando order by

É possível deixar consultas com "order by" mais rápidas se a coluna sendo ordenada tiver um índice. Porém, nem sempre o MySQL vai usar o índice nesses casos. Você pode verificar se houve a otimização com o comando EXPLAIN.

Este artigo foi útil para você?