Le dernier signalement de chacun
Boss · indexing, top-n-per-group, loose-index-scan, sorting
Étant donnée une table bugs(id, token, title, category, device, reported_at, created_at, updated_at)
d'environ 10 millions de lignes, trouvez pour chaque rapporteur (token) le bug qu'il a signalé le
plus récemment : celui dont reported_at est le plus récent et, si plusieurs partagent cette date,
celui dont l'id est le plus élevé. Renvoyez les colonnes (token, id).
Colonnes attendues
token, id
Indices
Indice 1 : lister les rapporteurs à moindre coût
Il y a environ 30 000 tokens et 10M de lignes. Comme dans « Quelles catégories de bugs avons-nous ? », SELECT DISTINCT category, token peut sauter dans l'index d'un token au suivant au lieu de lire chaque ligne.
Indice 2 : une plongée par token
Pour un seul token, le bug le plus récent est la dernière entrée de l'index sous (category, token) : l'index est trié par (category, token, reported_at, id). Une sous-requête corrélée avec ORDER BY ... DESC LIMIT 1 peut lire cette seule entrée, une fois par token.
Indice 3 : cherchez filesort dans EXPLAIN
Si EXPLAIN affiche 'Using filesort' sur la requête interne, MySQL lit les ~330 lignes de chaque token. Le WHERE interne compare à la ligne extérieure, pas à des constantes, donc MySQL ne retire pas category et token du tri. Mettez l'index entier dans l'ORDER BY (category DESC, token DESC, reported_at DESC, id DESC) et cherchez 'Backward index scan'.