Índices espaciales (GiST)
Acelere las consultas de ubicación.
Índices espaciales (GiST) es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 4 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.
Por qué las consultas de ubicación se vuelven lentas
Imagine una tabla con millones de ubicaciones de restaurantes. Si solicita «Busque todos los restaurantes que estén a menos de 5 km de mí», la base de datos debe comprobar cada fila para calcular la distancia. Esto se denomina escaneo secuencial y se vuelve extremadamente lento a medida que crece la tabla.
Los índices espaciales resuelven este problema al organizar los datos de geometría en una estructura de árbol, lo que permite que la base de datos omita instantáneamente grandes partes de la tabla.
¿Qué es un índice GiST?
GiST son las siglas de Generalized Search Tree (árbol de búsqueda generalizado). Es un marco flexible de indexación integrado en PostgreSQL que admite muchos tipos de datos, incluidas las formas geométricas y las geometrías de PostGIS.
A diferencia de un índice B-tree, que funciona con valores ordenables como enteros o cadenas, GiST puede indexar datos multidimensionales, como puntos, polígonos y líneas. PostGIS utiliza GiST internamente para crear sus índices espaciales.
Creación de un índice espacial
Crear un índice GiST en una columna de geometría es sencillo. Utilice CREATE INDEX con la cláusula USING gist. Esta única instrucción puede transformar una consulta que tarda minutos en una que tarda milisegundos.
CREATE INDEX idx_restaurants_geom
ON restaurants
USING gist (geom);Cómo funciona GiST: cajas envolventes
Un índice espacial GiST no almacena las geometrías exactas. En su lugar, almacena cajas envolventes: el rectángulo más pequeño que contiene cada geometría. El árbol se construye agrupando las cajas envolventes cercanas en cada nivel.
Cuando se ejecuta una consulta, PostgreSQL desciende por el árbol y poda las ramas cuyas cajas envolventes no se superponen con el área de búsqueda. Después, solo se comprueban con precisión las filas candidatas que quedan. Este enfoque en dos fases (sondeo del índice y comprobación posterior) es sumamente eficiente.
Configuración de una tabla de ejemplo
Antes de explorar el comportamiento de los índices, creemos una tabla de ejemplo con puntos de ciudades y rellenémosla con algunas filas. La columna geom almacena cada ciudad como un Point en WGS 84 (SRID 4326).
CREATE TABLE cities (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
geom GEOMETRY(Point, 4326)
);
INSERT INTO cities (name, geom) VALUES
('Paris', ST_SetSRID(ST_MakePoint(2.3522, 48.8566), 4326)),
('Berlin', ST_SetSRID(ST_MakePoint(13.4050, 52.5200), 4326)),
('Madrid', ST_SetSRID(ST_MakePoint(-3.7038, 40.4168), 4326)),
('Rome', ST_SetSRID(ST_MakePoint(12.4964, 41.9028), 4326)),
('Warsaw', ST_SetSRID(ST_MakePoint(21.0122, 52.2297), 4326));Adición del índice GiST
Una vez rellenada la tabla, añada un índice GiST en la columna geom. En tablas de producción con millones de filas, esta instrucción puede tardar unos minutos, pero solo debe ejecutarse una vez. Después, todas las consultas espaciales que utilicen esta columna se beneficiarán automáticamente.
CREATE INDEX idx_cities_geom
ON cities
USING gist (geom);
-- Verify the index exists
SELECT indexname, indexdef
FROM pg_indexes
WHERE tablename = 'cities';Operador de cajas envolventes &&
PostGIS ofrece el operador && para comprobar si dos cajas envolventes se superponen. Este operador es compatible con índices: el planificador utiliza automáticamente el índice GiST. Es mucho más rápido que calcular intersecciones geométricas exactas y suele utilizarse como prefiltro rápido.
-- Find cities whose bounding box overlaps a search rectangle
SELECT name
FROM cities
WHERE geom && ST_MakeEnvelope(-5, 40, 15, 50, 4326);Búsqueda de vecinos más cercanos con <->
El operador <-> devuelve la distancia entre dos geometrías y también está acelerado mediante GiST. Al combinarlo con ORDER BY ... LIMIT, obtiene una consulta de k vecinos más cercanos (KNN) extremadamente rápida, sin necesidad de un escaneo completo de la tabla.
-- Find the 3 cities closest to a reference point (Brussels)
SELECT name,
ST_Distance(
geom::geography,
ST_SetSRID(ST_MakePoint(4.3517, 50.8503), 4326)::geography
) / 1000 AS distance_km
FROM cities
ORDER BY geom <-> ST_SetSRID(ST_MakePoint(4.3517, 50.8503), 4326)
LIMIT 3;Comprobación del uso de índices con EXPLAIN
Utilice siempre EXPLAIN o EXPLAIN ANALYZE para confirmar que el planificador realmente utiliza su índice. Busque Bitmap Index Scan o Index Scan using idx_cities_geom en la salida. Si aparece Seq Scan, es posible que la tabla sea demasiado pequeña para que el planificador prefiera el índice.
EXPLAIN
SELECT name
FROM cities
WHERE geom && ST_MakeEnvelope(-5, 40, 15, 50, 4326);Creación simultánea de índices
La creación de un índice espacial grande con el comando estándar CREATE INDEX bloquea la tabla para las operaciones de escritura. En producción, utilice CREATE INDEX CONCURRENTLY para crear el índice sin bloquear las inserciones ni las actualizaciones. La desventaja es que tarda más y no puede ejecutarse dentro de un bloque de transacción.
-- Safe for production tables (no write lock)
CREATE INDEX CONCURRENTLY idx_restaurants_geom
ON restaurants
USING gist (geom);Mantenimiento del índice espacial
Con el tiempo, las inserciones, actualizaciones y eliminaciones frecuentes pueden provocar fragmentación del índice: este crece y se vuelve menos eficiente. Utilice REINDEX para reconstruirlo correctamente o programe ejecuciones periódicas de VACUUM ANALYZE para actualizar las estadísticas y ayudar al planificador de consultas a tomar mejores decisiones.
-- Rebuild the index to remove bloat
REINDEX INDEX idx_cities_geom;
-- Update planner statistics for the table
ANALYZE cities;Comprobación rápida: índices GiST
Compruebe su comprensión de los índices espaciales GiST en PostGIS.
Recapitulación: índices espaciales con GiST
En esta lección aprendió por qué los índices espaciales son esenciales para que las consultas de ubicación tengan un buen rendimiento y cómo GiST los hace posibles en PostgreSQL y PostGIS.
Conclusiones clave:
- GiST (árbol de búsqueda generalizado) es un tipo de índice flexible que admite datos de geometría multidimensionales.
- Cree un índice espacial con
CREATE INDEX ... USING gist (geom). - GiST almacena cajas envolventes y poda el árbol de búsqueda, evitando escaneos completos de la tabla.
- El operador
&&(superposición de cajas envolventes) y el operador<->(distancia/KNN) están acelerados mediante GiST. - Utilice
EXPLAINpara verificar el uso del índice yCREATE INDEX CONCURRENTLYen producción para evitar bloqueos de escritura. - Mantenga los índices con
REINDEXyANALYZEpara conservar el buen rendimiento de las consultas con el tiempo.
Preguntas frecuentes
¿La lección «Índices espaciales (GiST)» es gratis?
Sí — el texto completo de «Índices espaciales (GiST)» 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 espaciales (GiST)»?
Acelere las consultas de ubicación. 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 4 de 4.
¿Cuánto tiempo toma la lección «Índices espaciales (GiST)»?
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
- Tipos de datos espaciales
- Distancia y vecinos más cercanos
- Uniones espaciales y contención
- Índices espaciales (GiST)