Índices parciales y de expresiones
Indexe solo las filas que le interesen mediante cláusulas WHERE, e indexe expresiones calculadas (lower(email), date_trunc('day', ts)).
Índices parciales y de expresiones es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 3 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.
Índice parcial: indexar un subconjunto
Un índice parcial solo incluye las filas que coinciden con una cláusula WHERE al crear el índice. Es más pequeño, más rápido y excelente para la consulta más habitual:
CREATE INDEX users_active_email_idx
ON users(email)
WHERE deleted_at IS NULL;Cuándo resultan útiles los índices parciales
Utilícelos cuando:
- Siempre filtra con el mismo predicado (por ejemplo, el borrado lógico)
- Un valor predomina en la columna (por ejemplo, el 95 % de las filas tiene status='closed')
- Quiere un índice pequeño y activo en la caché
Ejemplo: sesiones activas
La mayoría de las sesiones han caducado; solo se consultan las activas:
CREATE INDEX sessions_active_idx ON sessions(user_id)
WHERE expires_at > NOW();
-- Caveat: planner can't use NOW() in the index predicate — use a fixed timestamp
-- and reindex periodically, OR use a boolean column.Mejor: utilice un predicado estable
El predicado del índice debe ser immutable. Las expresiones que dependen del tiempo (NOW()) no son válidas. Utilice en su lugar una columna como is_active:
CREATE INDEX sessions_active_idx ON sessions(user_id)
WHERE is_active = true;
-- The query must use the same predicate to match the index:
SELECT * FROM sessions WHERE is_active = true AND user_id = 42;Índice de expresión
Indexe una función de una columna:
CREATE INDEX users_email_lower_idx ON users(LOWER(email));
SELECT * FROM users WHERE LOWER(email) = LOWER('Alice@Example.com');
-- Uses the expression index.Índices de expresión habituales
LOWER(email)para búsquedas que no distinguen entre mayúsculas y minúsculas(price * tax_rate)para ordenar por un valor calculadodate_trunc('day', created_at)para informes diarios(data ->> 'user_id')::BIGINTpara extraer datos JSONB
La expresión debe ser IMMUTABLE
La expresión debe estar marcada como IMMUTABLE: su resultado depende únicamente de la entrada. RANDOM(), NOW() y CURRENT_USER no son válidas.
Combinación de índice parcial y de expresión
Ambos pueden combinarse:
CREATE INDEX articles_active_title_idx
ON articles(LOWER(title))
WHERE published_at IS NOT NULL;Índices parciales únicos
El patrón clásico de «una única fila activa»:
CREATE UNIQUE INDEX users_one_active_email
ON users(email)
WHERE deleted_at IS NULL;
-- Same email can exist many times in deleted users, but only once active.El predicado del índice debe coincidir con la consulta
El planificador solo utiliza el índice parcial cuando la cláusula WHERE de la consulta «implica» el predicado del índice:
-- Index: WHERE is_active = true
-- Match: WHERE is_active = true AND user_id = 42 ✓
-- Match: WHERE is_active AND user_id = 42 ✓
-- No: WHERE user_id = 42 ✗
-- No: WHERE is_active IS NOT FALSE ✗ (logically same but planner may not realise)No abuse de ellos
Muchos índices parciales que cubren subconjuntos disjuntos pueden ralentizar las escrituras (cada INSERT debe actualizar todos los índices relevantes). Utilícelos con moderación para las consultas críticas.
Resumen
Los índices parciales y de expresión ofrecen más rendimiento por byte.
- Parcial: indexe solo el subconjunto que consulta
- De expresión: indexe valores calculados
- Ambos requieren predicados IMMUTABLE
- La consulta debe utilizar el mismo predicado para coincidir
Comprobación rápida
Quiere realizar búsquedas de correo electrónico sin distinguir entre mayúsculas y minúsculas. ¿Qué índice es más eficiente?
Preguntas frecuentes
¿La lección «Índices parciales y de expresiones» es gratis?
Sí — el texto completo de «Índices parciales y de expresiones» 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 parciales y de expresiones»?
Indexe solo las filas que le interesen mediante cláusulas WHERE, e indexe expresiones calculadas (lower(email), date_trunc('day', ts)). 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 3 de 4.
¿Cuánto tiempo toma la lección «Índices parciales y de expresiones»?
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