O que é um índice de banco de dados?
Um índice de banco de dados é, segundo a Wikipedia, "uma referência associada a uma chave, que é utilizada para fins de otimização, permitindo uma localização mais rápida de um registro". Pense como o índice de um livro: em vez de folhear página por página, você vai direto ao capítulo. No banco, o índice funciona como uma estrutura separada que aponta para onde os dados estão armazenados.
Como um índice melhora a performance?
Quando você faz uma consulta com WHERE, JOIN ou ORDER BY, o banco precisa percorrer todas as linhas da tabela (full scan) para encontrar os registros. Com um índice, ele localiza rapidamente a posição exata. Isso reduz drasticamente o tempo de resposta, especialmente em tabelas com milhões de linhas.
Quando criar um índice?
Crie índices em colunas que aparecem com frequência em:
- Filtros:
WHERE cliente_id = 123 - Junções:
JOIN pedidos ON clientes.id = pedidos.cliente_id - Ordenações:
ORDER BY data_criacao DESC
Também vale para colunas usadas em buscas de texto com LIKE 'prefixo%'.
Quando evitar criar um índice?
Evite índices em:
- Tabelas muito pequenas (menos de 1000 registros): o custo de manter o índice supera o ganho.
- Colunas com baixa cardinalidade: por exemplo, uma coluna
statuscom apenas 3 valores possíveis. O índice não ajuda porque cada valor aponta para muitos registros. - Colunas que sofrem muitas inserções, atualizações ou exclusões: cada operação de escrita exige que o índice seja atualizado, o que pode piorar a performance.
Quais os tipos de índice mais comuns?
Os bancos relacionais oferecem principalmente:
- Índice B-Tree (padrão na maioria dos SGBDs): eficiente para buscas por igualdade e intervalos.
- Índice Hash: ótimo para buscas exatas, mas não suporta ordenação.
- Índice Bitmap: indicado para colunas com poucos valores distintos (ex.: sexo, status).
Cada banco tem suas particularidades. Consulte a documentação do seu SGBD.
Como criar um índice na prática?
No SQL padrão, a sintaxe é simples:
CREATE INDEX idx_nome_coluna ON nome_tabela (coluna);
Você pode criar índices compostos (várias colunas) e até índices únicos para garantir unicidade. Exemplo:
CREATE UNIQUE INDEX idx_email_unico ON usuarios (email);
Resumo prático
Crie índices em colunas de filtro, junção e ordenação, mas só depois de analisar o plano de execução das consultas. Monitore o desempenho e remova índices não utilizados. Lembre-se: índice acelora leitura, mas custa escrita e espaço.
FAQ
Índice de banco de dados deixa a consulta mais rápida?
Sim, desde que a coluna indexada seja usada no filtro ou na junção. O banco vai direto aos registros, sem percorrer a tabela inteira.
Qual a diferença entre índice clusterizado e não clusterizado?
Índice clusterizado reorganiza a ordem física dos dados na tabela (só um por tabela). O não clusterizado mantém a ordem original e cria uma estrutura separada com ponteiros.
Índice ocupa espaço no banco?
Ocupa. Cada índice é uma estrutura armazenada em disco. Quanto mais índices, mais espaço e mais tempo para backups.
Posso criar índice em coluna de texto?
Pode, mas o índice será menos eficiente se o texto for muito longo. Prefira índices parciais ou use full-text search para buscas textuais.
Como saber se um índice está sendo usado?
Consulte o plano de execução da consulta (EXPLAIN no MySQL, plano de execução no SQL Server). Ele mostra se o índice foi utilizado ou se houve full scan.
Índice acelera INSERT e UPDATE?
Não. Pelo contrário: cada INSERT ou UPDATE que modifica uma coluna indexada exige que o índice seja atualizado, o que pode tornar a operação mais lenta.