Ter um indice certo pode fazer uma query ir de 10 segundos para milissegundos. Mas indices demais ou errados atrapalham mais que ajudam.
O comando basico para criar um indice:
CREATE INDEX idx_clientes_email ON clientes(email);
Isso acelera buscas por email. Sem o indice, o banco faz uma varredura completa na tabela.
Para indices compostos (mais de uma coluna):
CREATE INDEX idx_pedidos_cliente_data ON pedidos(cliente_id, data_criacao);
A ordem das colunas importa. Esse indice ajuda queries que filtram por cliente_id ou por cliente_id + data_criacao. Mas nao ajuda queries que filtram so por data_criacao.
Para ver se uma query esta usando indice, use EXPLAIN:
EXPLAIN ANALYZE SELECT * FROM clientes WHERE email = 'joao@email.com';
O resultado mostra se o banco fez um Index Scan (bom) ou Seq Scan (ruim).
Indices parciais sao otimos para filtrar um subconjunto especifico:
CREATE INDEX idx_pedidos_pendentes ON pedidos(status)
WHERE status = 'pendente';
Se voce sempre busca pedidos pendentes, esse indice e muito menor que um indice completo.
Indices unicos garantem que nao ha valores duplicados:
CREATE UNIQUE INDEX idx_cpf_unico ON clientes(cpf);
Isso e equivalente a uma constraint UNIQUE, mas explicito como indice.
Para buscas de texto parcial (LIKE), use indices com varchar_pattern_ops:
CREATE INDEX idx_clientes_nome ON clientes(nome varchar_pattern_ops);
Isso acelera consultas como WHERE nome LIKE 'Silva%'.
Indices em tabelas grandes tem custo: eles desaceleram INSERT, UPDATE e DELETE. Cada vez que voce insere uma linha, o banco atualiza todos os indices.
Para monitorar indices nao usados:
SELECT
schemaname,
tablename,
indexname,
idx_scan,
idx_tup_read,
idx_tup_fetch
FROM pg_stat_user_indexes
ORDER BY idx_scan ASC
LIMIT 10;
Indices com idx_scan baixo sao candidatos a remocao.
Uma dica pratica: indices em colunas com baixa cardinalidade (como status com 3 valores possiveis) raramente ajudam. O banco prefere ler a tabela toda em vez de usar o indice.
Para colunas booleanas ou de poucos valores, indices parciais sao a melhor opcao.
That's all for now.
Thanks for reading!
Top comments (0)