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.