Indexação
Um índice é como o índice remissivo no final de um livro: ele deixa o banco de dados pular direto para as linhas correspondentes em vez de varrer todas elas. Sem índices, as consultas ficam mais lentas conforme os dados crescem — tudo bem com 100 linhas, doloroso com 1.000.000.
Sem um índice, o banco de dados checa cada linha em ordem; com um índice, ele pula direto para o resultado, da mesma forma que o índice de um livro te manda para a página certa em vez de te fazer ler do início ao fim:
SEM ÍNDICE (Seq Scan) COM ÍNDICE (Index Scan)
lê CADA linha, uma por uma pula direto para os resultados
┌─────────────────────┐ ┌─────────────┐
│ linha 1 ✗ │ │ ÍNDICE │
│ linha 2 ✗ │ │ author_id │
│ linha 3 ✓ match │ ◀──────┐ │ ──┬── │
│ linha 4 ✗ │ │ └─────┼───────┘
│ ... (1.000.000) │ │ ▼
│ linha N ✓ match │ └──▶ linhas 3, 998 ✓
└─────────────────────┘ alguns saltos, não um milhão
A orientação prática:
- Indexe colunas que você frequentemente usa para filtrar ou fazer join (ex.:
author_id,email). - Chaves primárias são indexadas automaticamente.
- Não indexe tudo — cada índice acelera leituras, mas desacelera escritas e usa espaço.
- Adicione índices quando você perceber uma consulta lenta, não preventivamente para toda coluna.
A maneira honesta de descobrir se um índice ajuda é perguntar ao banco de dados, não adivinhar. Todo motor tem EXPLAIN (no Postgres, EXPLAIN ANALYZE), que mostra o plano que ele vai usar:
EXPLAIN ANALYZE
SELECT * FROM posts WHERE author_id = '...';
Se a saída disser Seq Scan em uma tabela grande, o banco de dados está lendo cada linha — um sinal de que um índice ajudaria. Depois de adicionar um, deveria mudar para um Index Scan. Esta é uma ótima tarefa para delegar à IA: cole a consulta lenta e a saída do EXPLAIN, e pergunte qual índice adicionar e por quê. Você mantém o controle entendendo a resposta, não memorizando teoria de índices.