首页
学习
活动
专区
圈层
工具
发布

SQL性能
EN

Stack Overflow用户
提问于 2011-09-14 03:24:07
回答 5查看 106关注 0票数 1

我有一个可以工作的SQL语句,但处理起来需要很长时间

我有一张a_log表和一张people表。我需要在people表中找到最后一个活动以及与给定person的每个id相关联的用户。

代码语言:javascript
复制
SELECT p.`id`, activity, appphone, appname, dateadd 
FROM people p
LEFT JOIN a_log a
ON p.id = a.id 
WHERE (  dateadd >= '2011/09/13 00:00' and dateadd <= '2011/09/13 23:59') 
AND (a.date_time = (SELECT MAX(a1.date_time)
       FROM activity_log a1
       WHERE a.id = a1.id
       GROUP BY id) OR date_time IS NULL)
    ORDER BY `id` desc limit 0, 100

我对a_log表中的date_time字段和id字段有一个非唯一索引,对people表中的dateadd字段有一个主索引和一个非唯一索引

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-14 04:52:03

这对你来说应该是可行的:

代码语言:javascript
复制
SELECT p.`id`, p.activity, p.appphone, p.appname, p.dateadd, a.*
FROM people p
LEFT OUTER JOIN
(
    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
) a ON p.id = a.id 
WHERE (  dateadd >= '2011/09/13 00:00' and dateadd <= '2011/09/13 23:59'   and `agent_or_underwriter` != 'agent') 
ORDER BY p.id desc limit 0, 100
票数 3
EN

Stack Overflow用户

发布于 2011-09-14 03:34:40

在较高的级别(不知道表的模式、索引、RDBMS、磁盘结构等)。

我会尝试通过运行两个查询来删除子查询(一个用于获取最大日期,另一个用于运行外部查询)。

我也会(正如马克提到的),看一下执行计划(使用mysql use Explain:http://dev.mysql.com/doc/refman/5.5/en/explain-output.html ),这应该会让你站在正确的起点上开始优化。

如果你尝试这两点,你应该能处于一个更好的位置。

票数 2
EN

Stack Overflow用户

发布于 2011-09-14 03:32:04

尝试使用派生表而不是子查询。应该会让事情变得更快。

代码语言:javascript
复制
SELECT p.id, activity, appphone, appname, dateadd  
FROM   people p 
       LEFT JOIN a_log a 
       LEFT JOIN (
           SELECT ID, MAX(date_time) MaxDate 
             FROM activity_log
             GROUP BY ID
       ) a1
          ON a.ID = a1.ID
WHERE  a.date_time IS NULL OR a.date_time = ISNULL(a1.MaxDate, a.date_time) --??
ORDER BY id desc limit 0, 100 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7407294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档