2015-02-05 31 views
0

我有一張用戶表(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個用戶需要45S。

(我已經在msgs.uID一個索引,msgs.created_date。)

我在做什麼錯?我需要一個很多更快的查詢。

回答

0

select users.*, msgs2.* from users inner join ( select msgs.* from msgs inner join ( select max(created_date) as dt, user_id from msgs group by user_id ) last_dt on msgs.user_id = last_dt.user_id and msgs.created_date = last_dt.dt ) msgs2 on users.id = msgs2.user_id

試試這個,我很抱歉,如果這可能是有一些語法錯誤,或者也可以由工程慢,我直接寫此查詢,沒有任何測試。

試試吧。

+0

相當接近,雖然 – Strawberry 2015-02-05 21:54:09

+0

好多了,但還是來了〜2.8s我。 – 2015-02-05 21:55:16

+0

爲什麼子選擇了msgs的外部實例,而不是簡單地加入到users表中? – symcbean 2015-02-05 22:08:57

1

我在發佈之前搜索過(沒有運氣),但在發佈之後在「相關」側欄中找到了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不能做得更快嗎?

只有兩個
+0

如果不知道a)你的表的結構和b)上述EXPLAIN的輸出 – Strawberry 2015-02-06 00:36:57

0

解決方案加入

SELECT u.id,u.name,msgs_max.note FROM users u JOIN 
(SELECT m1.uID, m1.note FROM msgs m1 LEFT JOIN msgs m2 
ON (m1.created_date < m2.created_date 
AND m1.uID = m2.uID) 
WHERE m2.id IS NULL) msgs_max 
ON u.uID=msg_max.uID 

參考:https://stackoverflow.com/a/123481/2180715

相關問題