我有一个用户表(1,000s)和一个用户消息表(100,000s)。我想要一种快速获取所有用户及其最新消息的方法。

我目前正在使用的是类似...

SELECT
   u.id, u.name,
   (
      SELECT note FROM msgs
      WHERE msgs.uID=u.id
      ORDER BY created_date DESC
      LIMIT 1
   ) as note
FROM users u


现在,如果我限制为20个用户,则需要2.5秒... 200个用户需要45秒。

(我已经在msgs.uID和msgs.created_date上有了一个索引。)

我究竟做错了什么?我需要一个更快的查询。

最佳答案

我在发布之前进行了搜索(没有运气),但是发布后在“相关”侧栏中发现了this solution

SELECT    u.id, u.first_name, msgs.note
FROM      users u
JOIN      (
              SELECT    MAX(created_date) max_date, user_id
              FROM      msgs
              GROUP BY  user_id
          ) msgs_max ON (msgs_max.user_id = u.id)
JOIN      msgs m ON (msgs.created_date = msgs_max.max_date AND u.id = msgs.user_id)


好多了,但在我的桌子上仍然约1.3秒。 MySQL不能这么快吗?

07-27 17:27