Índices concurrentes (CREATE INDEX CONCURRENTLY)
Cree índices sin bloquear las escrituras mediante CREATE INDEX CONCURRENTLY y recupérese de creaciones interrumpidas.
Índices concurrentes (CREATE INDEX CONCURRENTLY) 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.
El problema de CREATE INDEX
Un CREATE INDEX normal adquiere un bloqueo SHARE: bloquea las escrituras, pero no las lecturas, durante toda la creación. En una tabla con mil millones de filas, esto supone varios minutos de interrupción de las escrituras.
CONCURRENTLY: la solución
CREATE INDEX CONCURRENTLY crea el índice sin bloquear las escrituras:
CREATE INDEX CONCURRENTLY idx_orders_user_id ON orders(user_id);Cómo funciona
Dos recorridos de la tabla:
- Primera pasada: crea el índice a partir de las filas actuales
- Segunda pasada: incorpora las filas modificadas durante la primera pasada
Además, espera brevemente a cualquier transacción simultánea que se iniciara antes de la creación.
No se puede ejecutar dentro de una transacción
CONCURRENTLY confirma la transacción dos veces, por lo que no puede ejecutarse dentro de un bloque explícito BEGIN/COMMIT:
BEGIN;
CREATE INDEX CONCURRENTLY ...; -- ERROR
COMMIT;Lento, pero en línea
CONCURRENTLY tarda más que un CREATE INDEX normal (dos recorridos y esperas de bloqueos). La ventaja: cero tiempo de inactividad.
Recuperación tras un fallo
Si CONCURRENTLY falla (por una interrupción o un error del sistema), el índice queda en estado INVALID:
SELECT relname FROM pg_class
WHERE relkind = 'i' AND NOT pg_index.indisvalid;
-- Fix: drop and re-create:
DROP INDEX CONCURRENTLY my_idx;
CREATE INDEX CONCURRENTLY my_idx ON ...;REINDEX CONCURRENTLY
Lo reconstruye sin bloquear, desde PG 12:
REINDEX INDEX CONCURRENTLY orders_user_id_idx;
REINDEX TABLE CONCURRENTLY orders;DROP INDEX CONCURRENTLY
Tampoco bloquea:
DROP INDEX CONCURRENTLY old_idx;Índices UNIQUE
Los índices UNIQUE también se pueden crear con CONCURRENTLY. Resulta útil para añadir restricciones UNIQUE en línea:
CREATE UNIQUE INDEX CONCURRENTLY users_email_uidx ON users(email);
ALTER TABLE users ADD CONSTRAINT users_email_unique UNIQUE USING INDEX users_email_uidx;Índices de claves foráneas
Patrón estándar para añadir una FK a una tabla grande:
-- 1. Build the index online:
CREATE INDEX CONCURRENTLY orders_user_id_idx ON orders(user_id);
-- 2. Add the FK with NOT VALID (instant):
ALTER TABLE orders ADD CONSTRAINT orders_user_fk
FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
-- 3. Validate in the background:
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_fk;Coste de crear índices simultáneamente
Dos recorridos completos de la tabla, además del mantenimiento de estructuras auxiliares. Consume CPU y E/S. Si es posible, ejecútelo durante las horas de menor tráfico.
Supervisar el progreso
PG 12 y versiones posteriores muestran el progreso en pg_stat_progress_create_index:
SELECT phase,
blocks_done, blocks_total,
tuples_done, tuples_total
FROM pg_stat_progress_create_index;Resumen
CONCURRENTLY es la forma adecuada para producción de gestionar los índices.
- CREATE/DROP/REINDEX CONCURRENTLY no bloquean las escrituras
- No pueden ejecutarse dentro de una transacción
- Los fallos dejan índices INVALID: debe limpiarlos
- Supervise el progreso con pg_stat_progress_create_index
Comprobación rápida
¿Por qué CREATE INDEX CONCURRENTLY no puede ejecutarse dentro de un bloque explícito BEGIN/COMMIT?
Preguntas frecuentes
¿La lección «Índices concurrentes (CREATE INDEX CONCURRENTLY)» es gratis?
Sí — el texto completo de «Índices concurrentes (CREATE INDEX CONCURRENTLY)» 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 concurrentes (CREATE INDEX CONCURRENTLY)»?
Cree índices sin bloquear las escrituras mediante CREATE INDEX CONCURRENTLY y recupérese de creaciones interrumpidas. 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 concurrentes (CREATE INDEX CONCURRENTLY)»?
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
- Migraciones en línea: por qué ALTER TABLE bloquea
- Índices concurrentes (CREATE INDEX CONCURRENTLY)
- Renombrado de columnas sin tiempo de inactividad
- Herramientas: Flyway, Liquibase, Sqitch