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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top