# Índice de base de datos

> Un atajo ordenado para que la base encuentre filas sin leer toda la tabla.

- Nivel: Intermedio
- Temas: Datos, Software
- URL: https://tidbit.legios.com.ar/es/database-index/
- En inglés: [Database index](https://tidbit.legios.com.ar/database-index/)

Un **índice** es una estructura extra, guardada al lado de una tabla, que le permite a la base de datos saltar directo a las filas que le pedís. Sin uno, una consulta como 'buscá el cliente con email ana@example.com' obliga a un **recorrido completo** (full scan): leer todas las filas hasta que aparezca. Con un índice sobre la columna email, la base busca el valor en una estructura ordenada y va directo a la fila correcta.

La mayoría de los índices son un **B-tree**: una estructura ordenada que se ramifica, donde cada paso achica la búsqueda, así que encontrar un valor entre cien millones lleva un puñado de saltos en vez de cien millones de lecturas. Se crea con una línea de SQL, `CREATE INDEX ON clientes (email);`, y desde ahí la base lo mantiene actualizado sola y decide cuándo usarlo.

Los índices no son gratis. Cada uno ocupa disco, y cada alta o modificación tiene que actualizar también los índices, así que las escrituras se vuelven más lentas. El oficio está en elegirlos a partir de las consultas que la app de verdad hace: las columnas por las que filtra, une y ordena. Cuando una página que cargaba al instante empieza a tardar segundos a medida que crecen los datos, el primer sospechoso es un índice que falta.

## Una analogía

El índice al final de un libro. Para encontrar todas las páginas que hablan de 'fotosíntesis' mirás la lista alfabética en vez de leer el libro entero; el precio son unas páginas extra que hay que rehacer en cada edición nueva.

## Para quedarse

- Un índice cambia espacio en disco y escrituras más lentas por lecturas mucho más rápidas.
- Sin índice, la base tiene que recorrer todas las filas para responder una consulta.
- Indexá las columnas por las que filtrás, unís y ordenás, no todas.
- La mayoría de los índices son B-trees, que mantienen los valores ordenados para encontrarlos en pocos pasos.

## Para seguir leyendo

- [Índice (base de datos) en Wikipedia](https://es.wikipedia.org/wiki/%C3%8Dndice_(base_de_datos))
- [Índices, introducción (documentación de PostgreSQL, en inglés)](https://www.postgresql.org/docs/current/indexes-intro.html)

## Términos relacionados

- [Base de datos](https://tidbit.legios.com.ar/es/database/): Un depósito ordenado de datos que los programas consultan y actualizan sin riesgo.
- [SQL](https://tidbit.legios.com.ar/es/sql/): El lenguaje para hacerle preguntas a una base de datos.
