Aprende SQL

Índices: CREATE INDEX

Lección 05 · Estructura de tablas

Índices: CREATE INDEX

Un índice es una estructura que la base de datos crea para encontrar filas más rápido. Funciona como el índice de un libro: en vez de leer página por página, vas directamente al tema que buscas.

Diagrama: “Sin índice (Full Table Scan)” revisa todas las filas vs “Con índice en year” salta directo al valor (1985, 1986, 1997, 2011, 2013 → resaltado, 2015, 2018).

¿Por qué importan los índices?

Sin un índice, cuando ejecutas WHERE year = 2013, la base de datos tiene que revisar cada fila de la tabla (lo que se llama un full table scan). Con un índice en la columna year, puede saltar directamente a las filas que cumplen la condición.

En tablas pequeñas la diferencia es imperceptible. Pero en tablas con miles o millones de filas, un índice puede convertir una consulta de segundos en una de milisegundos.

Crear un índice

CREATE INDEX nombre_indice ON tabla(columna);

Por ejemplo, para crear un índice en la columna year:

CREATE INDEX idx_videogames_year ON videogames(year);

La convención más habitual para nombrar índices es idx_tabla_columna.

Índices en múltiples columnas

Puedes crear un índice sobre varias columnas. El orden importa: el índice es más eficaz cuando filtras por las columnas en el mismo orden en que se definieron:

CREATE INDEX idx_videogames_dev_year ON videogames(developer, year);

Este índice acelera consultas como:

  • WHERE developer = 'Nintendo' (usa la primera columna)
  • WHERE developer = 'Nintendo' AND year > 2000 (usa ambas columnas)

Pero no ayuda con WHERE year > 2000 solo (porque year no es la primera columna del índice).

Índices únicos

Un índice único además de acelerar las búsquedas, impide valores duplicados en esa columna:

CREATE UNIQUE INDEX idx_videogames_title ON videogames(title);

Con este índice, intentar insertar dos juegos con el mismo título dará error. Las claves primarias (PRIMARY KEY) ya crean un índice único automáticamente.

Eliminar un índice

DROP INDEX nombre_indice;

O de forma segura:

DROP INDEX IF EXISTS nombre_indice;

¿Cuándo crear índices?

Sí conviene crear índices en:

  • Columnas que usas frecuentemente en WHERE.
  • Columnas de JOIN (claves foráneas).
  • Columnas que usas en ORDER BY con tablas grandes.
  • Columnas con muchos valores distintos (alta cardinalidad).

No conviene crear índices en:

  • Tablas muy pequeñas (no hay mejora apreciable).
  • Columnas con pocos valores distintos (ej: una columna booleano).
  • Tablas donde haces muchos INSERT/UPDATE/DELETE y pocas lecturas, porque cada escritura también tiene que actualizar los índices.

Tip: Los índices aceleran las lecturas pero ralentizan ligeramente las escrituras. Cada INSERT o UPDATE tiene que actualizar también los índices. Encuentra el equilibrio según tu caso de uso.

Ver los índices de una tabla

En SQLite puedes consultar los índices existentes con:

SELECT name, tbl_name
FROM sqlite_master
WHERE type = 'index';

Nuestra tabla

Nombre de la Tabla: videogames

id title developer year playtime_hours
1 The Legend of Zelda Nintendo 1986 20
2 Super Mario Bros. Nintendo 1985 10
3 Final Fantasy VII Square Enix 1997 40
4 The Witcher 3 CD Projekt Red 2015 100
5 Minecraft Mojang Studios 2011 9999
6 Grand Theft Auto V Rockstar Games 2013 80
7 Dark Souls FromSoftware 2011 60
8 Portal 2 Valve 2011 8
9 Red Dead Redemption 2 Rockstar Games 2018 70
10 The Last of Us Naughty Dog 2013 15
11 Halo: Combat Evolved Bungie 2001 10
12 God of War Santa Monica Studio 2018 25

Tablas de esta lección

videogames5 cols

Estructura

🔑idINTEGERtitleTEXTdeveloperTEXTyearINTEGERplaytime_hoursINTEGER

Datos de ejemplo (5 filas)

idtitledeveloperyearplaytime_hours
1The Legend of ZeldaNintendo198620
2Super Mario Bros.Nintendo198510
3Final Fantasy VIISquare Enix199740
4The Witcher 3CD Projekt Red2015100
5MinecraftMojang Studios20119999
6Grand Theft Auto VRockstar Games201380
7Dark SoulsFromSoftware201160
8Portal 2Valve20118
9Red Dead Redemption 2Rockstar Games201870
10The Last of UsNaughty Dog201315
11Halo: Combat EvolvedBungie200110
12God of WarSanta Monica Studio201825

Ejercicios

Crea un índice llamado 'idx_videogames_year' en la columna year de la tabla videogames.

sql

Crea un índice compuesto llamado 'idx_videogames_dev_year' en las columnas developer y year.

sql

Crea un índice único llamado 'idx_videogames_title' en la columna title para evitar títulos duplicados.

sql

Consulta todos los índices de la base de datos usando la tabla sqlite_master. Muestra las columnas name y tbl_name.

sql