Selecionar apenas mais novos registros da tabela e fazer este jejum, como?
-
19-09-2019 - |
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?
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 ??p>
Além disso, gostaria de fazer se você tem um índice em user_id.
EDIT: generalizada