Dernières locations depuis l'Égypte
Intermédiaire · indexing, sorting, joins, join-order, limit
Étant données 2 tables, customers(id, name, country) et
rentals(id, store_id, customer_id, inventory_id, status, rental_date, amount) de 3 millions de lignes,
listez les 10 locations les plus récentes faites par des clients dont le country est 'Egypt',
rental_date le plus récent en premier. Si deux partagent le même rental_date, triez-les par
inventory_id décroissant, puis customer_id décroissant. Renvoyez les colonnes
(rental_date, inventory_id, name).
Colonnes attendues
rental_date, inventory_id, name
Indices
Indice 1 : qui mène la jointure
Faites un EXPLAIN de la jointure évidente. MySQL part de customers (country n'est pas indexé, il lit donc les 50 000), récupère toutes les locations de chaque client égyptien via idx_customer et trie le résultat. Un index ne peut trier une jointure que si toutes les colonnes de l'ORDER BY appartiennent à la première table du plan.
Indice 2 : parcourez rentals du plus récent au plus ancien
SHOW INDEX FROM rentals : la clé unique rental_date est (rental_date, inventory_id, customer_id), exactement l'ordre demandé. Lisez-la à rebours et vérifiez le client de chaque location par clé primaire ; environ 2 % des clients sont égyptiens, donc la 10e correspondance arrive après quelques centaines de locations.
Indice 3 : imposez l'ordre à MySQL
STRAIGHT_JOIN joint les tables dans l'ordre où vous les écrivez : FROM rentals r STRAIGHT_JOIN customers c ON .... Gardez l'ORDER BY sur des colonnes de rentals qui correspondent à l'index ; ajouter r.id le casse, car id vient après customer_id dans cet index.