调优SQL查询以获得更好的性能

时间:2011-09-13 17:21:19

标签: mysql 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字段上有一个非唯一索引。

我们如何才能缩短此查询的执行时间?

2 个答案:

答案 0 :(得分:4)

您目前拥有的是相关子查询,它需要对从外部选择返回的每一行进行计算。

相反,将整个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

答案 1 :(得分:1)

如果您尝试这样做会发生什么:

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