Ocho segundos por cada llamada
Café Turia ha crecido. Su tabla de pedidos tiene ahora 2.000.000 de filas.
Cada vez que llama un cliente, el equipo busca sus pedidos por correo electrónico. La pantalla tarda ocho segundos en responder, y el cliente espera al teléfono.
Una sola línea de SQL lo deja en menos de una décima de segundo.
Al final de esta lección
Nota
Puedo explicar cómo un índice hace más rápida una consulta.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Recorrido completo | leer todas las filas de la tabla, una a una | SCAN |
| Índice | una lista ordenada de una columna que apunta a las filas | |
| Búsqueda por índice | ir directo a las filas usando el índice | SEARCH |
| Plan de consulta | el camino que la base de datos elige para responder | |
| EXPLAIN QUERY PLAN | muestra el plan sin ejecutar la consulta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Sin índice, se lee todo
Imagina buscar a una persona en una lista de dos millones de nombres sin ningún orden. Tienes que leerlos todos, porque puede estar en cualquier sitio.
Eso hace la base de datos cuando no hay índice: un recorrido completo. Prueba cada fila contra el WHERE, desde la primera hasta la última. Con pocas filas no se nota. Con millones, son segundos.
Ejemplo: filas que hay que mirar
| Filas en la tabla | Sin índice | Con índice, más o menos |
|---|---|---|
| 1.000 | 1.000 | 10 pasos |
| 100.000 | 100.000 | 17 pasos |
| 2.000.000 | 2.000.000 | 21 pasos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un índice es una lista ordenada
Un índice se parece a una guía de calles ordenada de la A a la Z. Como está en orden, vas directo a la letra que buscas y no lees el resto.
El índice guarda los valores de una columna en orden. Junto a cada valor anota dónde está la fila.
EXPLAIN QUERY PLAN delante de una consulta enseña el camino elegido: SCAN es leer todo y SEARCH es usar un índice.
Prueba: el plan sin índice
-- ¿Qué camino sigue la base de datos? Todavía no hay índice.
EXPLAIN QUERY PLAN
SELECT * FROM orders WHERE email = '[email protected]';
-- Busca la palabra SCAN en el resultado.
Prueba: el plan con índice
-- Creamos un índice sobre la columna email.
CREATE INDEX idx_orders_email ON orders(email);
-- La misma pregunta de antes.
EXPLAIN QUERY PLAN
SELECT * FROM orders WHERE email = '[email protected]';
-- Ahora busca SEARCH y el nombre del índice.
Un índice tiene un precio
Un índice no cambia las filas que salen. Solo cambia el camino para llegar a ellas.
Pero ocupa espacio en disco. Además, cada vez que entra un pedido nuevo, la base de datos actualiza también el índice.
Por eso se indexan las columnas por las que se busca a menudo, no todas.
Prueba: el mismo resultado con y sin índice
CREATE INDEX idx_orders_email ON orders(email);
-- Sin EXPLAIN: la consulta normal, ya con índice.
SELECT id, amount FROM orders WHERE email = '[email protected]';
-- Borra la línea CREATE INDEX y vuelve a ejecutar.
-- ¿Cambian las filas?
Un error frecuente
Advertencia
Mucha gente cree que cuantos más índices, mejor. No es así. Cada índice ocupa espacio y hace más lenta cada escritura. Crea un índice cuando una columna aparece a menudo en WHERE o en ON y la consulta va lenta.