今天发现一段老代码,是表单统计的时候用的,就是从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等)
下图是总数据量(默认本月):
下图是优化后的查询,每次都不超过4秒,修改SQL前每次都在11~15秒
下图是调整SQL前的时间,用了12秒多
随着系统上线,交易数据会不断增大,所以数据库的优化非常重要。设计数据库的时候要考虑到数据量的检索,比如增加索引、调整类型等。