Si una consulta tarda segundos en una tabla grande, lo más probable es que falte un índice.
La idea, en una analogía
Un libro de 800 páginas sin índice te obliga a leerlo entero para encontrar algo: eso es un full table scan. El índice es el apartado del final —“transacciones → página 342”— que te lleva directo al dato.
Cómo lo logra
La mayoría de motores usan un B+Tree: búsqueda en O(log n) en lugar de O(n). Un millón de filas pasan de ~1.000.000 de lecturas a unas ~20.
CREATE INDEX idx_usuarios_email ON usuarios (email);
Comprueba que se usa con EXPLAIN ANALYZE: si ves Index Scan y no Seq Scan, vas bien.
Pero no son gratis
Cada INSERT, UPDATE o DELETE también actualiza el índice, y ocupa disco. Indexa columnas que lees y filtras mucho en tablas grandes; evita booleanos y tablas diminutas.
Regla práctica: indexa lo que lees mucho y mide con
EXPLAIN. Los números mandan, no las intuiciones.