← Volver a los artículos
Rendimiento y bases de datos

Detrás de escena del rendimiento: ¿dónde y cómo almacenan las bases de datos sus índices?

Una inmersión profunda en el almacenamiento físico de los índices de bases de datos: tablespaces, estructura de páginas B+tree, índices hash y bitmap, más consejos prácticos sobre ubicación, mantenimiento y monitoreo.

✦
Artículo destacado ↗

Detrás de escena del rendimiento: ¿dónde y cómo almacenan las bases de datos sus índices?

Si una base de datos es una biblioteca, entonces los datos son los libros en los estantes, y los índices son el catálogo inteligente que te permite encontrar el libro correcto en segundos sin escanear cada estante. Todo el mundo sabe que los índices aceleran las búsquedas. Pero ¿alguna vez te has preguntado dónde viven físicamente estos índices y cómo están estructurados bajo el capó? Comprender esto es la clave para una verdadera optimización.

Dejemos las abstracciones y miremos dentro.

El principio fundamental: un índice es una estructura de datos separada

Es crucial entender desde el principio: un índice no se almacena «junto» con los datos de las filas de la tabla. Es una estructura independiente, pero estrechamente vinculada. Cuando creas un índice, el SGBD crea y mantiene un objeto especial, la mayoría de las veces basado en árboles balanceados (B-tree, B+tree).

Entonces, ¿dónde está en el disco? Hay varias opciones:

  1. En el mismo tablespace que la propia tabla. Este es el enfoque predeterminado más común (por ejemplo, en PostgreSQL, MySQL InnoDB). Los datos de una tabla y sus índices son diferentes conjuntos de páginas (bloques) dentro de los mismos archivos. Conveniente para la gestión, pero puede provocar contención de E/S entre las operaciones de lectura/escritura de datos e índices.
  2. En un tablespace separado o en un disco separado. Esta es una técnica de optimización avanzada. Por ejemplo, puedes colocar los índices en un SSD rápido y los datos a los que se accede con menos frecuencia en un HDD más lento. O distribuir la carga de E/S. Esto es posible en Oracle, SQL Server, PostgreSQL.
-- Ejemplo para PostgreSQL: crear una tabla con un índice en otro tablespace CREATE TABLESPACE indexspace LOCATION '/mnt/fast_ssd'; CREATE INDEX idx_orders_user_id ON orders(user_id) TABLESPACE indexspace;

El corazón del índice: la estructura B+Tree en detalle

Casi todos los SGBD relacionales usan un B+tree. Visualicemos su anatomía:

  • Nodos raíz y no hoja: Contienen claves de navegación (por ejemplo, valores de la columna indexada) y punteros a nodos hijos. Esta es la «tabla de contenidos» del catálogo.
  • Nodos hoja: Esta es la parte más importante. Almacenan los valores de clave indexados y punteros (o los datos reales de la fila, en el caso de un índice agrupado).

En el disco físico, todos estos nodos del árbol se almacenan en páginas o bloques — fragmentos de memoria de tamaño fijo (típicamente 4-16 KB). Las páginas están enlazadas entre sí para formar la estructura del árbol.

Casos especiales y otras estructuras

  1. Índices Hash: Se usan para búsquedas exactas (=). Son tablas hash donde la clave es el valor hash de la columna y el valor es un puntero a la fila. Se almacenan en su propio segmento de memoria/disco. Muy rápidos pero inútiles para consultas de rango.
  2. Índices Bitmap: Ideales para columnas con baja cardinalidad (género, estado). Son arrays de bitmaps. Se almacenan en formato comprimido, ahorrando espacio. Cada bitmap corresponde a un valor único.
  3. Índices invertidos: La base de la búsqueda de texto completo (FTS). Almacenan palabras (tokens) y una lista de documentos/filas donde aparecen. Estas son estructuras especializadas, a menudo gestionadas por motores separados (como Lucene en Elasticsearch).

¿Por qué es importante este conocimiento práctico?

  1. Rendimiento de consultas: Un índice mal diseñado (en una columna de baja cardinalidad) ocupará espacio en disco sin proporcionar beneficios.
  2. Planificación de la ubicación del almacenamiento: En sistemas de alta carga, puedes colocar índices y datos en discos físicos diferentes para reducir la contención de E/S.
  3. Mantenimiento: Los índices se fragmentan con actualizaciones frecuentes. Operaciones como REINDEX o REORGANIZE los reconstruyen, reordenando físicamente las páginas para una lectura secuencial más rápida.
  4. Monitoreo: Puedes consultar vistas del sistema (como pg_stat_all_indexes en PG o sys.indexes en SQL Server) para ver el tamaño del índice en disco y sus estadísticas de uso.

Conclusión: Los índices no son magia; son estructuras de datos concretas, físicamente existentes. Su eficiencia depende no solo de la lógica (qué campos indexar) sino también de la ubicación física y la mecánica interna. Una comprensión profunda de estos mecanismos separa a un buen desarrollador de un verdadero ingeniero de bases de datos.

Tecnologías y temas

Etiquetas del artículo

No hay artículos que coincidan con estos filtros.

¿Tienes un proyecto o una idea para discutir?

Hablemos ↗