Con retraso o perdidos
Núcleo · indexing, sorting, union, 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,
lista los 10 alquileres más recientes de la tienda 12 cuyo status es 'late' o 'lost', 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, status, rental_date).
Columnas esperadas
id, status, rental_date
Pistas
Pista 1: qué le hace IN al orden
Ejecuta la consulta obvia con status IN ('late', 'lost') y haz EXPLAIN: 'Using filesort'. El índice está ordenado por (store_id, status, rental_date), así que las filas 'late' y las 'lost' son dos tramos ordenados por separado. Entre los dos, rental_date no está en orden, así que MySQL los lee todos y ordena.
Pista 2: un tramo cada vez
Con un solo status fijado, el orden del índice es el ORDER BY, como en «Retrasos en la tienda 7». Los 10 más recientes de la lista combinada tienen que estar entre los 10 'late' más recientes más los 10 'lost' más recientes.
Pista 3: combina
Pon cada mitad entre paréntesis con su propio ORDER BY ... LIMIT 10, únelas con UNION ALL en una tabla derivada y luego ORDER BY rental_date DESC, id DESC LIMIT 10 fuera. La ordenación final solo ve 20 filas.