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