mysql查询响应时间过长
为什么mysql中的此类查询需要太长时间才能响应:mysql查询响应时间过长,mysql,Mysql,为什么mysql中的此类查询需要太长时间才能响应: select s.sid,s.sname, sum(case WHEN d.dgr_date='2014-12-31' then d.daily_gen end) as dgen, round(sum(case WHEN d.dgr_date between '2013-12-01' and last_day ('2013-12-31') then d.daily_gen end)/1000000,2) as pmtd fr
select s.sid,s.sname,
sum(case WHEN d.dgr_date='2014-12-31' then d.daily_gen end) as dgen,
round(sum(case WHEN d.dgr_date between '2013-12-01' and last_day
('2013-12-31') then d.daily_gen end)/1000000,2) as pmtd
from dgrs d ,locs l, spvs s
where l.mloc=d.mc_loc and s.sid=l.spid
group by s.sname;
index: compound(d.dgr_date, d.daily_gen), d.mc_loc(fk:l.mloc), l.mloc, s.sid
Main table: dgrs(400k rows).
解释疑问
GROUP BY
子句中使用索引字段。我猜s
sid
是表spv
的PK
。使用它而不是s
sname
WHERE
子句中显示的字段编制索引dgr_date
上放置索引,并将条件从第二个案例
移动到where子句中:
SELECT s.sid, s.sname,
SUM(IF(d.dgr_date = '2014-12-31', d.daily_gen, 0)) as dgen,
ROUND(SUM(d.daily_gen)/1000000, 2) AS pmtd
FROM dgrs d, locs l, spvs s
WHERE l.mloc = d.mc_loc
AND s.sid = l.spid
AND d.dgr_date BETWEEN '2013-12-01' AND '2013-12-31'
GROUP BY s.sid
select s.sid,s.sname,
sum(case WHEN d.dgr_date='2014-12-31' then d.daily_gen end) as dgen,
round(sum(case WHEN d.dgr_date between '2013-12-01' and last_day
('2013-12-31') then d.daily_gen end)/1000000,2) as pmtd
from dgrs d
inner join locs l on l.mloc=d.mc_loc
inner join spvs s on and s.sid=l.spid
group by s.sname;
你自己调试过吗?你解释过了吗?你有没有试着把东西移到更快的地方?你试过JOIN吗?是的,我试过了,每次我收到mysql的长响应。你错过了
s
上的“使用临时;使用文件排序”吗?可能是因为s.sname的小组
?我是否需要使用临时文件进行申请;在s上使用filesort。我唯一关心的是不同的“sid”是否有多个公共“sname”值“价值观。。。我怀疑这一点,但我已经看到了它和你的目标,我会建议…好的观点。我没有考虑过这一点,但事实上,对于不同的sid
在sname
上具有相同的值也会产生错误的结果。通过理解您的观点,我在dgrs上进行了复合索引(mc_loc,dgr_date),其中只有mc_loc是早期未索引的连接点。这解决了问题,并在.19秒内返回查询。非常感谢你的提示。
select s.sid,s.sname,
sum(case WHEN d.dgr_date='2014-12-31' then d.daily_gen end) as dgen,
round(sum(case WHEN d.dgr_date between '2013-12-01' and last_day
('2013-12-31') then d.daily_gen end)/1000000,2) as pmtd
from dgrs d
inner join locs l on l.mloc=d.mc_loc
inner join spvs s on and s.sid=l.spid
group by s.sname;