El último reporte de cada uno

Jefe · indexing, top-n-per-group, loose-index-scan, sorting

Dada una tabla bugs(id, token, title, category, device, reported_at, created_at, updated_at)

con unos 10 millones de filas, encuentra para cada reportero (token) el bug que reportó más

recientemente: el de reported_at más reciente y, si varios comparten esa fecha, el de id más alto.

Devuelve las columnas (token, id).

Columnas esperadas

token, id

Pistas

Pista 1: lista los reporteros sin coste

Hay unos 30.000 tokens y 10M de filas. Como en «¿Qué categorías de bugs tenemos?», SELECT DISTINCT category, token puede saltar por el índice de un token al siguiente en lugar de leer cada fila.

Pista 2: una búsqueda por token

Para un solo token, el bug más reciente es la última entrada del índice bajo (category, token): el índice está ordenado por (category, token, reported_at, id). Una subconsulta correlacionada con ORDER BY ... DESC LIMIT 1 puede leer solo esa entrada, una vez por token.

Pista 3: busca filesort en EXPLAIN

Si EXPLAIN muestra 'Using filesort' en la consulta interna, MySQL lee las ~330 filas de cada token. El WHERE interno compara con la fila exterior, no con constantes, así que MySQL no quita category y token del orden. Pon el índice completo en el ORDER BY (category DESC, token DESC, reported_at DESC, id DESC) y busca 'Backward index scan'.