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.