选择从表只记录最新的,让这快,怎么样?
-
19-09-2019 - |
题
你好,我有一个问题,我有很多挣扎,希望有人已经找到了巧妙的解决了这一点(我使用MySQL)。
我有表是这样的:
Table `log`
----------
id
inserted
message
user_id
我的目标是选择最后插入记录的用户,使这个快。日志表是巨大的(约900K记录) 所以我的第一种方法是:
SELECT * FROM `log`
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN
(
SELECT MAX(`id`) FROM `log` GROUP BY `user_id`
)
但似乎它计算子查询的每一行(解释节目关联查询)。当我分裂此查询两个:
SELECT MAX(`id`) FROM `log` GROUP BY `user_id`
和
SELECT * FROM `log`
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN (....ids from first query...)
是可以接受的运行。这可以由一个查询被achived?
解决方案
除了使用GROUP BY来获取组间最大值,你可能要使它成为一个不相关的子查询获取从表中的特定行附加字段。
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
这效果最好/最快的,如果你有一个指数
KEY `foo` (`user_id`,`id`)
但即使没有该密钥的性能下降。
其他提示
约
如何SELECT user_id, max(id) FROM `log` GROUP BY user_id
这将让你在日志表中每个用户的最大ID,都在一个查询!
如果你一直在寻找的日志为特定的用户,通过USER_ID分割日志文件将加速了很多东西。如果表被用户分配,通过ID索引,查询将运行速度非常快。
编辑:看到多米尼克的查询
另外,我会确保你有USER_ID的索引。
编辑:广义
不隶属于 StackOverflow