【问题标题】:tuning a SQL query for better performance调整 SQL 查询以获得更好的性能
【发布时间】:2011-09-13 17:21:19
【问题描述】:

我有这个有效的 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 字段上有一个非唯一索引。

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

【问题讨论】:

    标签: mysql performance


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果你尝试这个会发生什么:

      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 
      

      【讨论】:

        猜你喜欢
        • 2011-05-16
        • 2020-04-06
        • 2015-01-08
        • 2014-11-19
        • 1970-01-01
        • 2021-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多