mysql group 查询的替代,sql查询之统计数据的优化,用IF或者group by 代替多次查询全表...

今天发现一段老代码,是表单统计的时候用的,就是从mysql里面查询某个时间段的数据统计,根据时间自动格式化分组查询。

开始的时候都非常顺利,只是现在数据量有点大了(170w+)就显得有些慢了。

问题:数据量增大导致统计非常慢,多种类型的统计需要多次查询同一个表,导致查询消耗时间加N倍。

解决:将多条查询sql合并为一条,用IF判断或者group by 类型、时间后用php处理结果。

原来的sql:SELECT SUM(payPrice - refundMoney) total, DATE(payTime) payTime FROM tabl_name

WHERE payTime >= '" . $stime . "'

AND payTime <= '" . $etime . "' " . $where . "

GROUP BY DATE(payTime)

ORDER BY DATE(payTime) ASC

然后根据where多次按类型查询整个数据库。

调整后的sql:SELECT  SUM(IF(payChannel='wx_pub',payPrice - refundMoney,0)) wx_pub,

SUM(IF(payChannel='wx_lite',payPrice - refundMoney,0)) wx_lite,

SUM(IF(payChannel='wx_h5',payPrice - refundMoney,0)) wx_h5,

SUM(IF(payChannel='ali_wap',payPrice - refundMoney,0)) ali_wap,

SUM(payPrice - refundMoney) total,

DATE(payTime) payTime

FROM

table_name

WHERE

payTime >= '" . $stime . "'

AND payTime <= '" . $etime . "'

GROUP BY

DATE(payTime)

ORDER BY

DATE(payTime) ASC

这是用IF判断在一条SQL里面实现统计,这样减少了查询次数,大大提高了效率

说明:索引已经添加,两种结果查询后都需要重新格式化(如某日没有数据字段添加0等)

下图是总数据量(默认本月):

c1f8306b577b0dfdb6b5367516ea82f5.png

下图是优化后的查询,每次都不超过4秒,修改SQL前每次都在11~15秒

b37ebcd58bf65e9d3ff8fafd07dfa20e.png

下图是调整SQL前的时间,用了12秒多

afc96839e44865ec906767eb7e978303.png

随着系统上线,交易数据会不断增大,所以数据库的优化非常重要。设计数据库的时候要考虑到数据量的检索,比如增加索引、调整类型等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值