CodeGym /Cursos /SQL SELF /Tipos principales de índices: B-TREE,

Tipos principales de índices: B-TREE, HASH, GIN, GiST

SQL SELF
Nivel 37 , Lección 1
Disponible

Bueno, en el mundo de PostgreSQL hay varios tipos de índices, y cada uno está hecho para cumplir su propio papel único. Es como elegir un medio de transporte: puedes usar una bici para pasear por el parque, pero si tienes que cruzar toda la ciudad, seguramente prefieras un coche. Así mismo, diferentes índices sirven para diferentes tareas.

En PostgreSQL los tipos principales de índices incluyen:

  • B-TREE índices: índices universales para la mayoría de los casos.
  • HASH índices: optimizados para comparación exacta.
  • GIN índices: ideales para búsquedas en arrays y JSONB.
  • GiST índices: se usan para tipos de datos complejos, como los geográficos.

Los índices existen para acelerar la búsqueda de filas. Hay 4 tipos diferentes de optimización: cada tipo acelera ciertas acciones y va mejor con ciertos tipos de datos.

No puedes controlar los índices de ninguna manera. Todo lo que puedes hacer es elegir el tipo de índice: ninguno o uno de los de arriba. Ahora vamos a ver cada uno para entender cuándo y cómo usarlos.

Índices B-TREE

B-TREE (abreviatura de "balanced tree") — es el tipo de índice más común, la base de PostgreSQL. Este índice crea una estructura en forma de árbol, donde los datos están organizados para acelerar la búsqueda, el ordenamiento y el filtrado.

Imagínate una biblioteca con estanterías, donde cada estante tiene libros ordenados alfabéticamente. Si buscas un libro que empieza por "M", no tienes que mirar todos los libros uno por uno — basta con empezar por el medio. Así funcionan los árboles balanceados.

¿Cuándo usarlos?

¡Casi siempre! Los índices B-TREE son especialmente útiles para:

  • Búsqueda por rangos: WHERE price > 100.
  • Ordenar: ORDER BY name ASC.
  • Búsqueda por igualdad: WHERE id = 42.

Ejemplo de creación:

-- Creamos un índice B-TREE para la columna price de la tabla products:
CREATE INDEX idx_price ON products(price);

Cuando en tu consulta escribas algo como WHERE price > 100, PostgreSQL podrá usar este índice y no tendrá que mirar toda la tabla.

Índices HASH

Los índices HASH usan tablas hash para buscar rápido. Su punto fuerte es la comparación exacta de valores. Pero los índices HASH tienen una limitación: no soportan búsqueda por rangos ni ordenamiento.

Es como una caja de fichas, donde cada ficha tiene un número exacto. Buscas la ficha número 42 y el bibliotecario te la da al instante. Pero si pides: “enséñame las fichas del 40 al 50”, te dirán que no se puede.

Los índices HASH solo sirven para búsqueda exacta:

  • WHERE email = 'user@example.com'.
  • SELECT ... WHERE id = 123.

Si necesitas rangos u ordenamiento, HASH no te sirve.

Ejemplo de creación:

-- Creamos un índice hash para la columna email de la tabla users:
CREATE INDEX idx_email_hash ON users USING HASH (email);

Ahora PostgreSQL usará este índice para consultas como WHERE email = 'user@example.com'.

Ojo: los índices HASH son para casos muy concretos y se usan menos que los B-TREE.

Índices GIN (Generalized Inverted Index)

GIN — es un índice especializado que hace magia real con arrays, JSONB y datos de texto. Imagina que tienes un armario con miles de cajones, y cada cajón tiene una etiqueta. Por ejemplo, en el cajón "manzanas" están todas las manzanas, en el de "plátanos" — los plátanos. Para encontrar manzanas o plátanos, no tienes que buscar en todos los cajones — vas directo al que toca.

Los índices GIN sirven para:

  • Búsqueda en arrays: @> (contiene), <@ (está contenido).
  • Datos JSONB: WHERE jsonb_data @> '{"clave": "valor"}'.

Ejemplo de creación

-- Creamos un índice GIN para la columna tags, que contiene arrays:
CREATE INDEX idx_tags_gin ON products USING GIN (tags);

Ahora PostgreSQL podrá encontrar productos donde los tags sean, por ejemplo, "electrónica" y "recomendados".

Índices GiST (Generalized Search Tree)

Los índices GiST — son una herramienta potente para trabajar con tipos de datos más complejos, incluyendo coordenadas geográficas y rangos. Construyen árboles optimizados para búsquedas espaciales y por rangos.

Imagínate un mapa de la ciudad, donde cada punto está marcado según sus coordenadas. Puedes encontrar rápido todos los puntos en un radio de 5 km desde donde estás.

GiST sirve para:

  • Datos geográficos: SELECT ... FROM locations WHERE ST_DWithin(geom, point, distance).
  • Búsqueda por rangos: WHERE date_range && '[2023-01-01, 2023-12-31]'.

Ejemplo:

-- Creamos un índice GiST para la columna location, que contiene datos geográficos:
CREATE INDEX idx_location_gist ON places USING GiST (location);

Ahora puedes hacer consultas geográficas complejas, como buscar los puntos más cercanos.

Tabla comparativa de índices

Tipo de índice Sirve para... Ejemplos de uso Notas
B-TREE Búsqueda por rangos, ordenamiento price > 100, ORDER BY name ASC Índice universal.
HASH Chequeo exacto de igualdad email = 'user@example.com', id = 42 No soporta rangos.
GIN Arrays, JSONB tags @> '{tech}', jsonb_data @> '{"clave": "valor"}' Más rápido para datos complejos.
GiST Geografía, rangos, distancias ST_DWithin(geom, point, distance) Se usa para geodatos.

Ahora ya conoces los tipos principales de índices en PostgreSQL y cómo usarlos. Recuerda: elegir el índice es un paso estratégico que afecta la velocidad de tus consultas. ¡Jaque mate a la lentitud!

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION