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 users para encontrar las que cumplen la condición del correo electrónico
    • Recorrer cada fila de orders para encontrar aquellas cuyo user_id coincide 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ónico
    • idx_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:

    FactorEfecto
    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 RAMSi las tablas y los índices caben en memoria, las consultas se vuelven mucho más rápidas
    Velocidad de la CPUAfecta a la rapidez con la que se recorren los nodos del árbol B
    Caché de búferesLas cachés con datos ya cargados aceleran mucho las consultas repetidas
    Tamaño de la tablaCuanto 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