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

为什么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
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
    
  • 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
      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;