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等)


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


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



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

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




评论/留言