【问题标题】:MySql query optimization without subquery没有子查询的MySql查询优化
【发布时间】:2013-02-26 00:49:45
【问题描述】:

谁能帮我优化这个查询?

SELECT distinct t.designation,
      (SELECT sum(time_to_sec(timediff(outtime,intime))) 
       FROM onlinetime where datecreated BETWEEN '2012-01-01 00:00:01' 
       AND '2012-12-31 23:59:59' and designation=t.designation) as totsec
FROM onlinetime t;

我正在尝试从在线时间表中获取名称和秒数总和。它只有 8000 条记录,但上述查询需要大量时间来执行。有没有其他方法可以优化这个?

【问题讨论】:

    标签: mysql sql optimization


    【解决方案1】:

    当您可以直接获得每个名称的总摘要时,为什么您需要加入表格

    SELECT  designation, sum(time_to_sec(timediff(outtime,intime))) totsec
    FROM    onlinetime
    WHERE   datecreated BETWEEN '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
    GROUP   BY designation
    

    只需在 datecreated 列上添加索引以获得更快的性能。

    ALTER TABLE onlinetime ADD INDEX (datecreated)
    

    或者你想要这个,

    SELECT  a.designation, 
            COALESCE(sum(time_to_sec(timediff(b.outtime,b.intime))), 0) totsec
    FROM    onlinetime a
            LEFT JOIN onlinetime b
                ON  a.designation = b.designation AND
                    b.datecreated BETWEEN '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
    GROUP   BY a.designation
    

    【讨论】:

      【解决方案2】:

      正确答案是:

      SELECT t.designation,
             sum(case when datecreated between '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
                      then sum(time_to_sec(timediff(outtime,intime)
                 end) as totsec
      from onlinetime t
      group by t.designation
      

      将过滤放在where 子句中错过了原始查询的意图,即保留表中的所有“指定”。

      【讨论】:

        猜你喜欢
        • 2013-01-04
        • 2011-11-27
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多