O Problema
Você tem uma tabela pedidos com milhões de registros e precisa buscar pedidos de um cliente específico. A query simples assim demora uma eternidade:
SELECT * FROM pedidos WHERE cliente_id = 12345;
O MySQL retorna 30 segundos de espera. O PostgreSQL idem. O SQLite? Nem fala.
A Causa
Tabela sem índice na coluna cliente_id. O banco faz Full Table Scan — lendo todos os registros para encontrar os que correspondem ao critério.
A Solução
1. Adicione um índice
CREATE INDEX idx_pedidos_cliente_id ON pedidos(cliente_id);
Resultado: de 30s para 0.003s
2. Use EXPLAIN para analisar
EXPLAIN SELECT * FROM pedidos WHERE cliente_id = 12345;
Veja se o plano mostra Using index (bom) ou Using filesort/Using temporary (ruim).
3. Evite SELECT *
Ruim
SELECT * FROM pedidos WHERE cliente_id = 12345;
Bom
SELECT id, valor, data FROM pedidos WHERE cliente_id = 12345;
4. Verifique os índices existentes
SHOW INDEX FROM pedidos;
5. Use composição de índices quando necessário
-- Para queries que filtram por cliente E data
CREATE INDEX idx_pedidos_cliente_data ON pedidos(cliente_id, data DESC);
Resultado Final
| Métrica | Antes | Depois |
|---|---|---|
| Tempo de resposta | 30s | 0.003s |
| Full Table Scan | Sim | Não |
| Uso de memória | Alto | Baixo |
Regra de Ouro
Se uma coluna aparece em WHERE, JOIN ou ORDER BY, considere criar um índice nela.
Índices não são mágicos — eles ocupam espaço em disco. Mas na maioria dos casos, o ganho de performance vale muito mais que o custo de armazenamento.
Feito!
Nenhum comentário:
Postar um comentário