Seleccionar sólo los registros más recientes de mesa y hacer así de rápido, ¿cómo?
-
19-09-2019 - |
Pregunta
Buenos días, tengo una pregunta que estoy luchando con mucho, espero que alguien ya encontró una solución inteligente a este (utilizo MySQL).
Tengo tabla como la siguiente:
Table `log`
----------
id
inserted
message
user_id
Mi objetivo es seleccionar último registro insertado por el usuario y hacer así de rápido. tabla de registro es enorme (alrededor de 900k registros), así que mi primer acercamiento fue:
SELECT * FROM `log`
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN
(
SELECT MAX(`id`) FROM `log` GROUP BY `user_id`
)
Sin embargo, parece que calcular subconsulta para cada fila (explique espectáculos CONSULTA dependiente). Cuando me separé de esta consulta para dos personas:
SELECT MAX(`id`) FROM `log` GROUP BY `user_id`
y
SELECT * FROM `log`
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN (....ids from first query...)
Es aceptable para funcionar. Se puede esto achived por una consulta?
Solución
Además de utilizar por grupo a buscar el máximo de grupos sabia es probable que desee para que sea una subconsulta sin correlación en busca de campos adicionales para las filas específicas de la tabla.
SELECT
la.user_id,la.message
FROM
`log` as la
INNER JOIN
(
SELECT
user_id, MAX(id) AS maxid
FROM
`log`
GROUP BY
user_id
) as lb
ON
la.id = lb.maxid
Esto funciona mejor / más rápido si tiene un índice
KEY `foo` (`user_id`,`id`)
Pero incluso sin esa clave es el rendimiento descenso.
Otros consejos
¿Qué tal
SELECT user_id, max(id) FROM `log` GROUP BY user_id
Esto le dará el id máximo para cada usuario en la tabla de registro, todo en una sola consulta!
Si siempre está buscando el registro de un usuario en particular, la partición del archivo de registro por user_id sería acelerar las cosas mucho. Si la tabla se divide por el usuario e indexada por el ID, la consulta se ejecutará muy rápido.
EDIT: véase la pregunta de Dominik
Además, me gustaría asegurarse de que tiene un índice en user_id.
EDIT: generalizada