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

面对170万+数据量的统计查询,原SQL使用GROUP BY分组导致效率低下。通过将多个查询合并为一条SQL,利用IF条件判断不同支付渠道的总和,减少查询次数,显著提高查询速度。文章展示了优化前后的时间对比,并强调了数据库设计时考虑数据量检索的重要性,如添加索引和选择合适数据类型。
摘要由CSDN通过智能技术生成

今天发现一段老代码,是表单统计的时候用的,就是从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等)

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

986ecf210749113a0de9a9b3accba3dd.png

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

a016f82c68908d27882896b1a3b06b4f.png

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

c21a487f0b7ea146e43eb54aec095e5d.png

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值