Database Indexing acelera las queries de lectura a costa de overhead en escritura. Un índice es una estructura de datos separada que permite al database encontrar filas sin escanear toda la tabla.
¿Por qué Indexar?
Sin índice: SELECT * FROM users WHERE email = 'x' escanea todas las filas (O(n)).
Con índice: encuentra la fila en O(log n).
Tipos de Índices
B-Tree Index
El más común. Árbol balanceado sobre las columnas indexadas.
- Búsqueda exacta: O(log n).
- Range queries: O(log n + k) donde k = filas resultantes.
Hash Index
Usa hash function para mapear valores a buckets.
- Búsqueda exacta: O(1) promedio.
- Range queries: no soportado.
Clustered vs Non-Clustered
| Tipo | Almacenamiento | Ventaja |
|---|---|---|
| Clustered | Los datos están en el índice | Solo una por tabla, range queries rápidas |
| Non-clustered | Índice apunta a datos | Múltiples por tabla |
Composite Indexes
Índice sobre múltiples columnas: (last_name, first_name).
Leftmost prefix rule: el índice se usa si consultas por last_name, o (last_name, first_name), pero no por first_name solo.
Selectividad
- Alta selectividad (muchos valores distintos): índice muy efectivo.
- Baja selectividad (pocos valores, como boolean): índice casi inútil.
Trade-offs
| Beneficio | Costo |
|---|---|
| Queries más rápidas | Escrituras más lentas (INSERT/UPDATE/DELETE deben actualizar índice) |
| Menos I/O | Más espacio en disco |
| Efficient range queries | Mantenimiento overhead |
Aplicaciones
- OLTP — índices en foreign keys y columnas filtradas
- OLAP — índices en columnas de agregación
- Full-text search — índices invertidos (Elasticsearch)
- Enseñanza — introduce trade-offs en databases
Trayectoria de Práctica
- Investiga
EXPLAIN ANALYZE: verifica si tu query usa el índice. - Crea un índice compuesto: prueba leftmost prefix rule.
- Investiga covering index: ¿cuándo el query no necesita acceder a la tabla?
- Investiga index selectivity: ¿cuándo un índice no ayuda?
- Investiga índices parciales: ¿para qué sirven?