Tableau de bord des retours en retard
Boss · indexing, sorting, leftmost-prefix, lateral, 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
réparties sur 50 magasins, listez les 15 locations les plus récentes dont le status est 'late', tous
magasins confondus, 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, store_id, rental_date).
Colonnes attendues
id, store_id, rental_date
Indices
Indice 1 : le préfixe manquant
idx_store_status_date est (store_id, status, rental_date). Sans store_id, rental_date n'est pas trié sur tout l'index, seulement à l'intérieur de chaque groupe (store_id, status). Faites un EXPLAIN de la requête évidente : MySQL fait un skip scan de toutes les locations 'late' (environ 12 000) et les trie.
Indice 2 : par magasin, c'est facile
Pour un magasin, « En retard au magasin 7 » a montré que les locations 'late' les plus récentes sont un court parcours à rebours. Le top 15 global est forcément parmi le top 15 de chaque magasin. Listez les magasins à moindre coût avec SELECT DISTINCT store_id FROM rentals (un loose index scan), puis prenez le top 15 de chaque magasin avec une table dérivée LATERAL.
Indice 3 : vérifiez le plan interne
Dans LATERAL, store_id vient de la ligne extérieure : MySQL ne le traite donc pas comme une constante en faisant correspondre l'ORDER BY à l'index. Si EXPLAIN affiche 'Using filesort' sur la requête interne, nommez tout le préfixe : ORDER BY r.store_id DESC, r.status DESC, r.rental_date DESC, r.id DESC.