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.