Últimos alquileres desde Egipto
Núcleo · indexing, sorting, joins, join-order, 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 hechos por clientes cuyo country es 'Egypt', con el rental_date
más reciente primero. Si dos comparten rental_date, ordénalos por inventory_id descendente y luego
por customer_id descendente. Devuelve las columnas (rental_date, inventory_id, name).
Columnas esperadas
rental_date, inventory_id, name
Pistas
Pista 1: quién guía el join
Haz EXPLAIN del join obvio. MySQL empieza por customers (country no está indexado, así que lee los 50.000), obtiene todos los alquileres de cada cliente egipcio a través de idx_customer y ordena el resultado. Un índice solo puede ordenar un join cuando todas las columnas del ORDER BY pertenecen a la primera tabla del plan.
Pista 2: recorre rentals de lo más nuevo a lo más antiguo
SHOW INDEX FROM rentals: la clave única rental_date es (rental_date, inventory_id, customer_id), exactamente el orden pedido. Léela hacia atrás y comprueba el cliente de cada alquiler por clave primaria; alrededor del 2% de los clientes son egipcios, así que la décima coincidencia llega tras unos cientos de alquileres.
Pista 3: dile a MySQL el orden
STRAIGHT_JOIN une las tablas en el orden en que las escribes: FROM rentals r STRAIGHT_JOIN customers c ON .... Mantén el ORDER BY sobre columnas de rentals que coincidan con el índice; añadir r.id lo rompe, porque id va después de customer_id en ese índice.