- Publicado el
¿Qué son los índices SQL? Por qué importan y cómo funcionan
- Autores
¿Qué son los índices SQL? Por qué importan y cómo funcionan
Los índices son una de las herramientas más importantes para mejorar el rendimiento de las bases de datos.
En este artículo, aprenderás:
- Qué son los índices SQL
- Por qué aceleran drásticamente las consultas
- Cómo crearlos
- Un ejemplo que muestra diferencias de rendimiento
- Cómo funcionan internamente
Vamos a entender los índices de forma intuitiva.
¿Qué es un índice?
Un índice en SQL es una estructura de datos especial (normalmente un árbol B) que permite a la base de datos encontrar filas mucho más rápido, sin recorrer toda la tabla.
Puedes imaginar un índice como:
- Una lista ordenada de valores
- Cada valor apunta a una fila de la tabla principal
- Organizada para que la base de datos pueda buscar rápidamente (tiempo logarítmico)
Sin un índice → la base de datos debe comprobar cada fila.
Con un índice → la base de datos salta directamente a los valores coincidentes.
Por qué se crearon los índices SQL
Los índices existen para resolver un problema:
Acelerar las consultas que buscan valores específicos.
Se crearon porque los recorridos completos de tablas se vuelven demasiado lentos a medida que crecen los conjuntos de datos.
En una tabla de 10 filas, recorrerlas todas es rápido.
En una tabla de 10 millones de filas, hacerlo repetidamente resulta inviable.
Los índices permiten:
- Búsquedas rápidas
- Ordenación rápida (
ORDER BY) - Uniones rápidas
- Comprobaciones de unicidad rápidas (mediante un índice UNIQUE)
Bases de datos como PostgreSQL, MySQL y SQLite dependen de ellos.
Ejemplo con JOIN
Los índices también aceleran drásticamente las operaciones JOIN.
Utilicemos las tablas users y orders:
SELECT users.name, orders.product
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.email = 'bob@example.com';
Índices recomendados
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_orders_user_id ON orders(user_id);
Sin índices: Recorridos completos de ambas tablas
Cuando no existen índices sobre users.email y orders.user_id, la base de datos debe:
- Recorrer cada fila de
userspara encontrar las que cumplen la condición del correo electrónico - Recorrer cada fila de
orderspara encontrar aquellas cuyouser_idcoincide con esos identificadores de usuario
Esto se llama recorrido secuencial o recorrido completo de tabla.
Escala del ejemplo:
- Tabla
users: 100.000 filas - Tabla
orders: 1.000.000 de filas
La base de datos debe examinar:
- 100.000 filas de usuarios
- 1.000.000 de filas de pedidos
Aunque el resultado final pueda ser una sola fila, el coste de búsqueda es muy alto.
Rendimiento aproximado (varía según la máquina):
- Comprobación de 100 mil usuarios + 1 millón de pedidos
- Sin índices: entre ~300 y 600 ms
- Con índices: entre ~1 y 3 ms
Eso supone una mejora de entre 100× y 500×.
Con índices: Búsqueda rápida y directa
Con los dos índices:
idx_users_email→ permite localizar al instante al usuario con ese correo electrónicoidx_orders_user_id→ permite localizar al instante todos los pedidos de ese usuario
En lugar de recorrer millones de filas:
- La base de datos salta directamente a las entradas correctas del índice (una búsqueda en un árbol B)
- Solo se accede a las filas relevantes
- El JOIN se vuelve extremadamente rápido
¿Qué influye en el rendimiento?
Los tiempos exactos varían según el hardware, pero estos factores de la máquina son los más importantes:
| Factor | Efecto |
|---|---|
| Tipo de disco (SSD frente a HDD) | Gran impacto: los SSD son entre 10 y 100× más rápidos en acceso aleatorio |
| Cantidad de RAM | Si las tablas y los índices caben en memoria, las consultas se vuelven mucho más rápidas |
| Velocidad de la CPU | Afecta a la rapidez con la que se recorren los nodos del árbol B |
| Caché de búferes | Las cachés con datos ya cargados aceleran mucho las consultas repetidas |
| Tamaño de la tabla | Cuanto mayor es la tabla, más importantes son los índices |
Los índices son esenciales en las aplicaciones porque incluso las máquinas potentes tienen dificultades con los recorridos completos y repetidos de tablas a medida que crecen los datos.
- Sin índices: la base de datos debe leer cada fila de ambas tablas
- Con índices: la base de datos realiza búsquedas rápidas mediante estructuras de datos eficientes
- Esto permite que los JOIN escalen a millones de filas con tiempos de respuesta de milisegundos
Cómo funcionan los índices internamente (explicación sencilla)
La mayoría de las bases de datos SQL utilizan árboles B, que:
- Mantienen los valores ordenados
- Permiten una búsqueda similar a la binaria
- Tienen muy poca profundidad (normalmente de 3 a 5 niveles incluso en tablas enormes)
Esto significa que:
- Encontrar una fila requiere solo unas pocas comparaciones
- El acceso es predecible y rápido
- Los índices crecen de forma logarítmica, no lineal
No necesitas comprender el algoritmo en profundidad, pero esta es la idea principal:
Es mucho más rápido buscar en un árbol ordenado que entre un millón de filas sin ordenar.
¿Cuándo deberías utilizar un índice?
Utiliza un índice cuando:
- Consultas frecuentemente una columna con
SELECT - Filtras con
WHERE - Ordenas mediante
ORDER BY - Unes tablas mediante claves foráneas
- Garantizas la unicidad (
UNIQUE INDEX) - Buscas mediante consultas de igualdad o de rango
Los índices son especialmente útiles en:
- correo electrónico
- nombre de usuario
- created_at
- claves foráneas (
user_id,post_id) - slugs
- columnas de búsqueda
Cuándo no utilizar un índice
Los índices tienen costes:
- Ocupan espacio en disco
- Ralentizan las escrituras (INSERT/UPDATE/DELETE deben actualizar el índice)
Evita indexar:
- columnas booleanas
- columnas de cardinalidad muy baja (por ejemplo, género, estado = “activo”)
- columnas utilizadas rara vez en las consultas
- columnas de texto muy grandes