[英]tuning a SQL query for better performance
我有此SQL語句有效,但需要一段時間才能執行
我有一個活動表,我需要找到每個ID的最后一個活動和關聯的用戶。
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字段上有一個非唯一索引。
我們如何在此查詢上縮短執行時間?
當前您擁有的是一個相關子查詢,該子查詢需要對從外部選擇返回的每一行進行計算。
相反,將整個id和max(date_time)數據集作為子查詢返回並加入其中。 只需走一趟就可以訪問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
如果您嘗試這樣做,會發生什么:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.