En retard ou perdues

Intermédiaire · indexing, sorting, union, 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 du magasin 12 dont le status est 'late' ou 'lost',

rental_date le plus récent en premier. Si deux partagent le même rental_date, l'id le plus élevé

passe en premier. Renvoyez les colonnes (id, status, rental_date).

Colonnes attendues

id, status, rental_date

Indices

Indice 1 : ce que IN fait à l'ordre

Exécutez la requête évidente avec status IN ('late', 'lost') et faites un EXPLAIN : 'Using filesort'. L'index est trié par (store_id, status, rental_date), donc les lignes 'late' et les lignes 'lost' forment deux séquences triées séparément. Sur l'ensemble des deux, rental_date n'est pas dans l'ordre : MySQL les lit toutes et trie.

Indice 2 : une séquence à la fois

Avec un seul status fixé, l'ordre de l'index est l'ORDER BY, comme dans « En retard au magasin 7 ». Les 10 plus récentes de la liste combinée sont forcément parmi les 10 'late' les plus récentes et les 10 'lost' les plus récentes.

Indice 3 : fusionnez

Mettez chaque moitié entre parenthèses avec son propre ORDER BY ... LIMIT 10, réunissez-les avec UNION ALL dans une table dérivée, puis ORDER BY rental_date DESC, id DESC LIMIT 10 à l'extérieur. Le tri final ne voit que 20 lignes.