19年7月1日,遇到一个问题,单表百万级数据量查询2s+
SELECT x.jitai,banci,round(SUM(mishu),2) mishu,dengji
FROM dingdan_xmd x
WHERE x.sc_time >= '2019-06-28 00:00:00' AND x.sc_time <= '2019-06-29 00:00:00' AND gongsi = '王大锤'
GROUP BY x.dengji,x.banci,x.jitai ORDER BY banci DESC,jitai ASC
语句执行需要2.2S+,用户的页面会卡至少3S以上,非常不友好,所以开始查找资料调优
一篇博客说需要建立 联合索引,但是经过深思熟虑之后,决定只给sc_time建立一个索引
ALTER TABLE dingdan_xmd ADD INDEX sc_time_index(sc_time)
语句执行时间0.027S以下,完美解决问题
因为时间有可能重复,就不建唯一索引了。
你以为就完了?没有!把sc_time的跨度调大,当数据量达到8万条时,查询时间居然又回到了2.4S+
经过我不懈努力,根据索引大法好的原则,在原来索引的基础上,我将SQL语句做了修改
SELECT jitai,banci,round(SUM(mishu),2) AS mishu, dengji FROM dingdan_xmd WHERE gongsi = "王大锤" AND id BETWEEN (
SELECT id FROM dingdan_xmd WHERE gongsi = '王大锤' AND sc_time > '2019-05-28 00:00:00' limit 0,1
) AND (
SELECT id FROM dingdan_xmd WHERE gongsi = '王大锤' AND sc_time < '2019-06-29 00:00:00' ORDER BY id DESC limit 0,1
) GROUP BY dengji,banci,jitai ORDER BY banci DESC,jitai ASC
成功的将查询时间降低到了正负0.3s,对于10万级数据量暂时算是解决了问题
但是你以为这就完了,还没完呢,当时间跨度继续加大,筛选数据量达到百万级时,查询时间居然达到了狗血的3.551S,这简直是叔叔能忍,婶婶都不能忍,不过目前我还没有找到解决办法,挖个坑,过几天来填
参考资料: