2011-09-13 29 views
1

我有工作,但需要一段時間來執行調整獲得更好的性能SQL查詢

我有一個活動表,我需要找到的最後一個活動,每個ID相關聯的用戶這條SQL語句。

SELECT id, date_time, user 
FROM activity_log a 
WHERE a.date_time = (SELECT MAX(a1.date_time) 
       FROM activity_log a1 
       WHERE a.id = a1.id 
       GROUP BY id) 
ORDER BY `id` desc limit 0, 100 

我在date_time字段和id字段上有一個非唯一索引。

我們如何才能在此查詢上縮短執行時間?

回答

4

你目前擁有的是一個相關的子查詢,它需要對你從外層select中返回的每一行進行計算。

取而代之,將id和max(date_time)的整個數據集作爲子查詢返回並加入。這隻需要1次訪問activity_log表來查找每個max(date_time),並且將顯着提高您的運行時間。

SELECT a.id, a.date_time, a.user 
FROM activity_log a 
INNER JOIN (
    SELECT id, MAX(date_time) as date_time 
       FROM activity_log 
       GROUP BY id) a1 
ON a.id = a1.id and a.date_time = a1.date_time 
ORDER BY `id` desc limit 0, 100 
+0

的偉大工程。它快很多。非常感謝你 – user583576

1

,如果你試試這個什麼happends:

SELECT id, date_time, user 
FROM activity_log a 
WHERE EXISTS 
(SELECT 1 FROM (SELECT ID,MAX(a1.date_time) maxdate 
       FROM activity_log a1 
       GROUP BY ID) a1 WHERE A1.ID=A.ID AND A1.MAXDATE=a.date_time) 
ORDER BY `id` desc limit 0, 100 
+0

工程很好,謝謝你 – user583576