Índices: El Secreto del Rendimiento
Cómo hacer que tus consultas vuelen
La Analogía Perfecta: El Índice de un Libro
Imagina que buscas un capítulo específico en un libro de 500 páginas.
- Sin índice: Tendrías que leer página por página desde el principio hasta encontrar lo que buscas. Esto es un Full Table Scan en una base de datos.
- Con índice: Vas al índice al final del libro, buscas el capítulo, ves el número de página y vas directamente a ella. Esto es un Index Seek.
Un índice es una estructura de datos que permite a la base de datos encontrar filas de forma extremadamente rápida.
¿Cómo Funciona un Índice? La Estructura B-Tree
La mayoría de los índices en bases de datos relacionales usan una estructura de datos llamada B-Tree (Árbol B).
- Es una estructura de árbol auto-balanceada que mantiene los datos ordenados.
- Permite búsquedas, inserciones y eliminaciones en tiempo logarítmico (muy rápido).
- La base de datos navega el árbol desde la raíz hasta las hojas para encontrar la ubicación exacta de la fila en el disco.
Tipos de Índices: Clustered vs. Non-Clustered
Índice Agrupado (Clustered)
El índice ES la tabla. Los datos de la tabla están físicamente ordenados en el disco según la columna del índice.
- Solo puede haber uno por tabla.
- Generalmente se crea en la Llave Primaria.
- Extremadamente rápido para búsquedas por rango.
Índice No Agrupado (Non-Clustered)
Es una estructura separada de la tabla. Contiene la columna del índice y un puntero a la fila de datos real.
- Puede haber muchos por tabla.
- La tabla (heap) no tiene un orden físico.
- Requiere un paso extra (buscar en el índice y luego ir a la tabla).
El Costo Oculto de los Índices
Los índices son fantásticos para las lecturas (`SELECT`), pero tienen un costo en las operaciones de escritura.
- `INSERT` / `UPDATE` / `DELETE`: Cada vez que modificas una fila, la base de datos no solo debe modificar la tabla, sino también actualizar cada índice afectado para mantenerlo ordenado.
- Espacio en Disco: Cada índice es una estructura de datos adicional que ocupa espacio.
Conclusión: No se deben crear índices a la ligera. Hay que tener una estrategia.
Estrategia: ¿Cuándo Crear un Índice?
- 1️⃣
Columnas en la Cláusula `WHERE`
Es el caso de uso más importante. Indexa las columnas que usas frecuentemente para filtrar datos.
- 2️⃣
Columnas en `JOIN`s
Las llaves foráneas son candidatas perfectas para un índice. Acelera drásticamente la unión de tablas.
- 3️⃣
Columnas en `ORDER BY`
Si ordenas frecuentemente por una columna, un índice puede evitar una costosa operación de ordenamiento en memoria.
- ⚠️
Cuidado con...
Columnas de baja cardinalidad (pocos valores únicos, como 'Género') o tablas muy pequeñas.