你好,我有一个问题,我有很多挣扎,希望有人已经找到了巧妙的解决了这一点(我使用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的索引。

编辑:广义

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top