Índices compuestos y orden de las columnas
Elija el orden de las columnas en los índices compuestos, comprenda la regla del prefijo izquierdo y diseñe índices que cubran varias consultas.
Índices compuestos y orden de las columnas es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué es un índice compuesto?
Es un índice sobre más de una columna. Los B-tree de PostgreSQL pueden indexar hasta 32 columnas; en la práctica, lo habitual son entre 2 y 4.
CREATE INDEX orders_user_created_idx ON orders(user_id, created_at DESC);¿Por qué usar un índice compuesto?
Hay dos situaciones:
- La consulta filtra por varias columnas a la vez
- La consulta filtra por una columna y ordena por otra
Regla del prefijo izquierdo
Un índice sobre (a, b, c) puede atender:
WHERE a = ?WHERE a = ? AND b = ?WHERE a = ? AND b = ? AND c = ?
NO atiende WHERE b = ? por sí solo ni WHERE c = ?.
El orden importa
Coloque primero la columna más selectiva y la que se filtra con mayor frecuencia. Las columnas de igualdad deben ir antes que las columnas de rango:
CREATE INDEX orders_user_total_idx ON orders(user_id, total);
-- Best for: WHERE user_id = 42 AND total > 100
-- Also OK: WHERE user_id = 42
-- Useless: WHERE total > 100 (without user_id)Igualdad frente a rango
Los predicados de igualdad usan el índice de forma eficiente; los rangos también lo usan, pero limitan su utilidad posterior. Las columnas de igualdad deben ir primero:
-- Index: (status, created_at)
WHERE status = 'paid' AND created_at >= ... -- both columns used
WHERE created_at >= ... AND status = 'paid' -- index used for status, range scan on created_atEl orden del índice es el orden de clasificación
Un índice sobre (user_id, created_at DESC) atiende la consulta «pedidos del usuario, del más reciente al más antiguo» sin un paso de ordenación:
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE user_id = 42
ORDER BY created_at DESC LIMIT 10;
-- Index Scan, no Sort node neededIncluir columnas que no son claves (INCLUDE)
PG 11 y posteriores admiten INCLUDE para crear índices «cobertura»: las columnas adicionales se almacenan en las hojas, pero no se usan para ordenar:
CREATE INDEX orders_user_idx ON orders(user_id)
INCLUDE (total, status);
-- Enables Index-Only Scan for queries that need just these columns.Cuándo NO crear índices compuestos
Si las columnas se consultan de forma independiente, dos índices de una sola columna pueden atender más consultas. Los índices compuestos sacrifican flexibilidad para que «una consulta lo tenga todo».
Combinación de índices de mapa de bits
PostgreSQL puede combinar varios índices de una sola columna mediante Bitmap Index Scan:
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 42 AND status = 'paid';
-- BitmapAnd of two index scans — works without a composite, but slower than the right composite.Vigile la fragmentación de los índices
Los índices compuestos son más anchos. Índices más anchos = archivos más grandes = una menor parte del índice cabe en la caché. Utilícelos de forma deliberada.
Elección del orden de las columnas: ejemplo práctico
Consulta: «pedidos de un usuario en un intervalo de fechas, ordenados por fecha».
-- Index design:
CREATE INDEX orders_user_created_idx
ON orders(user_id, created_at DESC);
-- Query (efficiently uses the index):
SELECT * FROM orders
WHERE user_id = 42
AND created_at >= NOW() - INTERVAL '30 days'
ORDER BY created_at DESC LIMIT 10;Resumen
Los índices compuestos sirven para filtros con varias columnas y evitan pasos de ordenación.
- Regla del prefijo más a la izquierda
- Columnas de igualdad primero
- INCLUDE para columnas que solo sirven para cubrir la consulta
- Dos índices individuales o uno compuesto: depende de la combinación de consultas
Comprobación rápida
Tiene un índice en (user_id, status, created_at). ¿Qué consulta NO puede utilizarlo de forma eficiente?
Preguntas frecuentes
¿La lección «Índices compuestos y orden de las columnas» es gratis?
Sí — el texto completo de «Índices compuestos y orden de las columnas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Índices compuestos y orden de las columnas»?
Elija el orden de las columnas en los índices compuestos, comprenda la regla del prefijo izquierdo y diseñe índices que cubran varias consultas. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Índices compuestos y orden de las columnas»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Índices B-tree, Hash, GiST y GIN
- Índices compuestos y orden de las columnas
- Índices parciales y de expresiones
- Mantenimiento de índices y fragmentación