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.