Pergunta

Tenha um bom dia, tenho uma pergunta que eu estou lutando com um monte, esperança alguém já encontrou uma solução inteligente para isso (eu usar o MySQL).

Eu tenho tabela como esta:

Table `log`
----------
id
inserted
message
user_id

Meu objetivo é selecionar último registro inserido para o usuário e fazer isso rápido. tabela de log é enorme (cerca de 900k registros), por isso a minha primeira abordagem foi:

SELECT * FROM `log` 
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN 
(
 SELECT MAX(`id`) FROM `log` GROUP BY `user_id`
)

Mas parece que calcular subconsulta para cada linha (EXPLICAR mostra QUERY dependente). Quando eu dividir essa consulta para dois:

SELECT MAX(`id`) FROM `log` GROUP BY `user_id`

e

SELECT * FROM `log` 
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN (....ids from first query...)

É aceitável para ser executado. isto poderá ser conseguido por uma consulta?

Foi útil?

Solução

Além de usar grupo, para buscar o máximo do grupo-wise você provavelmente vai querer torná-lo uma subconsulta não correlacionada para buscar campos adicionais para as linhas específicas da tabela.

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

Isso funciona melhor / mais rápido se você tiver um índice

KEY `foo` (`user_id`,`id`)

Mas, mesmo sem essa chave do desempenho é descida.

Outras dicas

Como cerca

SELECT user_id, max(id) FROM `log` GROUP BY user_id

?

Isso vai te dar o id máximo para cada usuário na tabela de log, tudo em uma consulta!

Se você sempre está procurando o log para um usuário particular, dividindo o arquivo de log por user_id iria acelerar as coisas muito. Se a tabela é dividida pelo usuário e indexados pelo ID, a consulta vai correr muito rápido.

EDIT: ver de Dominik consulta

Além disso, gostaria de fazer se você tem um índice em user_id.

EDIT: generalizada

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top