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'.