【问题标题】: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 子句中错过了原始查询的意图,即保留表中的所有“指定”。