Contenido de esta guía
Respuesta rápida
Un índice compuesto contiene dos o más columnas en un orden definido. Por ejemplo, un índice sobre (cliente_id, fecha) puede encajar bien con consultas que primero restringen cliente_id y después usan fecha para acotar u ordenar resultados.
CREATE INDEX idx_pedidos_cliente_fecha
ON pedidos (cliente_id, fecha);El orden no es decorativo. En índices B-tree y en el modelo de índices multicolumna de SQLite, las columnas iniciales tienen un papel especial para localizar rangos del índice.
Modelo mental: una lista ordenada de claves
Piensa en un archivador ordenado primero por cliente y, dentro de cada cliente, por fecha. Encontrar los pedidos de un cliente y recorrerlos cronológicamente encaja con ese orden. Buscar únicamente por una fecha cualquiera plantea una pregunta distinta porque la primera organización del archivador sigue siendo el cliente.
Diseña desde la consulta: no preguntes “¿qué columnas son importantes?”, sino “¿qué filtros, joins y ordenaciones aparecen juntos con frecuencia?”.
Ejemplo: pedidos de un cliente desde una fecha
SELECT cliente_id, fecha, total
FROM pedidos
WHERE cliente_id = 3
AND fecha >= '2025-05-01'
ORDER BY fecha;| cliente_id | fecha | total |
|---|---|---|
| 3 | 2025-05-11 | 179,00 |
| 3 | 2025-05-20 | 36,90 |
| 3 | 2025-06-12 | 999,00 |
El índice (cliente_id, fecha) expresa el mismo orden conceptual: igualdad sobre la primera columna y un rango/orden sobre la siguiente. Que el optimizador elija finalmente ese índice depende del motor, las estadísticas, el tamaño de la tabla y el resto del plan.
Por qué importa el orden
| Índice | Encaje conceptual |
|---|---|
(cliente_id, fecha) | Consultas centradas en uno o varios clientes y luego fecha. |
(fecha, cliente_id) | Consultas centradas primero en un periodo y luego cliente. |
PostgreSQL documenta que un B-tree multicolumna es más eficiente cuando existen restricciones sobre las columnas iniciales. SQLite explica la misma idea mostrando que un índice multicolumna puede reutilizarse para búsquedas por su prefijo izquierdo.
Evita índices redundantes
Más índices no significa automáticamente mejor rendimiento. Cada índice ocupa espacio y debe mantenerse cuando cambian los datos. Si un índice largo ya cubre el prefijo de otro, revisa si el corto sigue aportando valor real antes de conservar ambos. La decisión final depende del motor y de tus consultas.
Usa EXPLAIN y mediciones representativas para comprobar el plan, en lugar de asumir que un índice será utilizado solo porque existe.
Errores frecuentes
Ordenar columnas por intuición
El orden debe reflejar patrones de consulta reales. Un índice diseñado para cliente_id + fecha no debe invertirse solo porque “fecha parece más selectiva” sin comprobar el plan y la carga.
Crear un índice por cada combinación posible
Eso aumenta mantenimiento y espacio. Prioriza las consultas importantes y evita combinaciones sin una necesidad medible.
Prometer que el índice siempre se usará
El optimizador puede preferir otro acceso. La utilidad depende de estadísticas, cardinalidad, tamaño y costes estimados.
Práctica guiada
Elige el orden para historial por cliente
Tu consulta habitual filtra por cliente_id = ?, descarta fechas anteriores a una fecha mínima y ordena el resultado por fecha. Escribe el CREATE INDEX que mejor refleja ese patrón.
Criterio de éxito: cliente_id aparece antes que fecha.
Solución razonada
CREATE INDEX idx_pedidos_cliente_fecha
ON pedidos (cliente_id, fecha);La primera columna localiza el cliente y la segunda organiza las entradas de ese cliente por fecha. Después debes comprobar con el plan de ejecución si tu motor y tus datos se benefician de ese diseño.
Qué debes recordar
- Un índice compuesto tiene varias columnas en un orden concreto.
- El orden debe partir de consultas reales, no de una regla aislada.
- En B-tree y SQLite, las columnas iniciales son especialmente importantes para acotar búsquedas.
- Un índice puede ayudar también a ordenar cuando el patrón coincide, pero el optimizador decide el plan final.
- Evita índices redundantes y valida con
EXPLAINy mediciones.