Panel de devoluciones con retraso
Jefe · indexing, sorting, leftmost-prefix, lateral, limit
Dadas 2 tablas, customers(id, name, country) y
rentals(id, store_id, customer_id, inventory_id, status, rental_date, amount) con 3 millones de filas
repartidas en 50 tiendas, lista los 15 alquileres más recientes cuyo status es 'late', de todas las
tiendas, con el rental_date más reciente primero. Si dos comparten rental_date, va primero el de id
más alto. Devuelve las columnas (id, store_id, rental_date).
Columnas esperadas
id, store_id, rental_date
Pistas
Pista 1: el prefijo que falta
idx_store_status_date es (store_id, status, rental_date). Sin store_id, rental_date no está ordenado en todo el índice, solo dentro de cada grupo (store_id, status). Haz EXPLAIN de la consulta obvia: MySQL hace un skip scan de todos los alquileres 'late' (unos 12.000) y los ordena.
Pista 2: por tienda, es fácil
Para una tienda, «Retrasos en la tienda 7» mostró que los alquileres 'late' más recientes son un recorrido corto hacia atrás. Los 15 primeros globales tienen que estar entre los 15 primeros de cada tienda. Lista las tiendas sin coste con SELECT DISTINCT store_id FROM rentals (un loose index scan) y luego toma los 15 primeros de cada tienda con una tabla derivada LATERAL.
Pista 3: revisa el plan interno
Dentro de LATERAL, store_id viene de la fila exterior, así que MySQL no lo trata como una constante al emparejar el ORDER BY con el índice. Si EXPLAIN muestra 'Using filesort' en la consulta interna, nombra el prefijo completo: ORDER BY r.store_id DESC, r.status DESC, r.rental_date DESC, r.id DESC.