Saltar al contenido

Cuando el índice no ayuda

SQL · Unidad 15: Índices y rendimiento

¿A quién llama hoy la bibliotecaria? La unidad pasada lo contestó así, sumándole a cada préstamo sus 3 días para ver si ya venció. Ella abre esa lista cada mañana, así que alguien le crea un índice sobre prestado. El plan sigue diciendo SCAN prestamos.

El índice está ordenado por prestado, y la consulta pregunta por otra cosa, DATE(prestado, '+3 days'), un valor que no está guardado en ningún sitio. Para conocerlo, la base tiene que calcularlo fila por fila. Una función alrededor de la columna deja su índice sin usar.

En esta app, también este índice dura lo que dura la ejecución.

CREATE INDEX idx_prestamos_prestado
ON prestamos (prestado);
EXPLAIN QUERY PLAN
SELECT id, socio
FROM prestamos
WHERE devuelto IS NULL
  AND DATE(prestado, '+3 days')
    < '2026-01-15';

Devuelve

detail
SCAN prestamos

El resto de la explicación está en la lección, que es del plan completo.

Ejercicios de esta lección

Se hacen en la app, que los corrige al momento y explica por qué.

  1. 1. Completa el código

    La misma lista de vencidos, con la cuenta pasada al otro lado: en vez de sumarle 3 días a cada préstamo, se le restan a hoy. Completa para que salga el mismo préstamo de antes, el de Diego.

  2. 2. Ordena las líneas

    La bibliotecaria cierra las cuentas de enero. La unidad pasada sacaba el mes con STRFTIME, que envuelve la columna. Ordena las líneas para ver el plan de la versión que deja prestado sin tocar y pide un rango de fechas. Sobran dos.

  3. 3. Encuentra el caso que falla

    La búsqueda de préstamos por socio compara con LOWER(socio) = 'ana', para que no importen las mayúsculas. Alguien la cambia por la de abajo, que deja la columna sin envolver y puede usar un índice. Tienen que seguir saliendo los id de todos los préstamos de Ana. ¿Con cuál de estos datos deja de salir alguno?

  4. 4. Encuentra el bug

    Con el índice sobre socio ya creado, el plan de la búsqueda de los préstamos de Ana debería decir SEARCH. Dice SCAN prestamos. ¿Qué línea tiene el problema?

  5. 5. Predice la salida

    En un índice, los títulos que empiezan igual están juntos, y los que terminan igual o llevan la misma palabra en medio están repartidos por todo él. La bibliotecaria busca los libros que llevan casa en cualquier parte del título, y alguien ya creó un índice sobre titulo. ¿Qué plan sale?

  6. 6. Opción múltiple

    prestamos tiene tres índices: sobre socio, sobre prestado y sobre libro_id. Entra un préstamo nuevo. ¿En cuántos sitios escribe la base?

  7. 7. Predice la salida

    Ana tiene tres préstamos. ¿Qué devuelve el SELECT, después de crear el índice y de quitarlo? (En esta app, de todos modos, la base vuelve a empezar al terminar.)

  8. 8. Opción múltiple

    De vuelta en la tienda. El buscador sin acentos de la unidad pasada compara así, y con un catálogo de 200 000 productos cada búsqueda recorre la tabla. ¿Qué lo arregla?

Hacer esta lección

Se abre en el navegador. Esta lección es del plan completo; la primera unidad de cada curso es gratis.

Ver todas las lecciones →