Consulta lente sem indíce
A pergunta que chega: "o que acontece por dentro quando o banco não tem índice?"
O banco lê a tabela linha por linha até achar o que você pediu. Com índice no campo da busca ele vai direto na linha. O EXPLAIN mostra qual dos dois caminhos ele usou.
Duas formas de achar o cliente 4242: varrer a tabela inteira ou descer por uma árvore até a folha certa.
Sem índice, o banco lê tudo
Se não existe índice na coluna do filtro, o Postgres faz um Seq Scan: abre a tabela do começo ao fim e testa cada linha.1 Com mil linhas ninguém percebe. Com milhões, a mesma consulta fica lenta, porque o trabalho cresce junto com a tabela.

Índice no campo que você busca
O índice guarda os valores da coluna em ordem, com o endereço de cada linha.2 Vale criar nas colunas que aparecem no WHERE, no JOIN e no ORDER BY das consultas que você mais roda.3
sqlCREATE INDEX usuarios_email_idx ON usuarios (email);Ele tem custo: cada escrita na tabela também atualiza o índice, e ele ocupa disco. Por isso eu crio pro que a aplicação busca de verdade.
Confira com EXPLAIN
Rode EXPLAIN antes da consulta e leia o primeiro nó do plano.1 Seq Scan numa tabela grande com filtro que pega poucas linhas pede índice. Index Scan com Index Cond mostra que o índice entrou.
sqlEXPLAIN SELECT * FROM usuariosWHERE email = 'maria@exemplo.com';
-- sem índice:Seq Scan on usuarios-- com índice:Index Scan using usuarios_email_idxPra guardar
- Sem índice no filtro, o banco lê a tabela inteira (Seq Scan).
- Crie índice nas colunas do
WHERE,JOINeORDER BYque você mais usa. - Confira com
EXPLAIN: o plano tem que mostrar o índice.


