线上项目通过mysql联合索引性能优化慢查询(从72秒优化到1.5秒左右)

线上项目,刚开始的时候,数据量比较小,系统性能没有任何问题。随着业务运行时间的增加,数据量会不断的增加,历史数据也会不断累积,这个时候,如果不进行性能优化,系统可能完全无法使用。特别是在数据量达到千万级别以后更是如此。

一个项目中,需要统计一年的账单数据(表中数据在将近1000万),sql执行居然用了将近72秒,整个业务耗时72.6秒。经过针对性的优化,整个业务的处理时间,只需要1.5秒。

1. 未优化前的情况

slow sql 71652 millis

select merchant_id , count(distinct epay_code) as epay_count,  ifnull(count(charge_id),0) as bill_count, ifnull(sum(pay_amt),0) as pay_amt 
    from trans_flow 
    where 1=1 and pay_status = '1'  
             and merchant_id = ?
       AND  epay_code in (SELECT epay_code FROM sys_user_epayitem  WHERE user_id=?)
        and bill_time >= CONCAT(?, ' 00:00:00')
        and bill_time <= CONCAT(?, ' 23:59:59')["1550000123","109","2018-12-01","2019-12-01"]

业务执行时间:

statisByShop Time Spend is:72615

13:05:25.954 [http-nio-8203-exec-26] INFO  c.f.c.s.i.TransFlowServiceImpl - [merchantStatics,220] - \ 
statisByShop Time Spend is:72615

通过分析,该业务涉及的时间范围广,数据量大,但是需要的数据字段并不多,所以可以针对该业务场景建立针对性的联合索引。

2. 创建联合索引

ALTER TABLE `trans_flow`
ADD INDEX `union_index` (`merchant_id`, `epay_code`, `pay_amt`, `pay_status`, `bill_time`) USING BTREE ;

3. 优化后的效果

慢查询sql已经不再出现。

业务执行时间:

statisByShop Time Spend is:1518

13:23:06.313 [http-nio-8203-exec-1] INFO  c.f.c.s.i.TransFlowServiceImpl - [merchantStatics,220] - \ 
statisByShop Time Spend is:1491

创建联合索引后,再次执行,效率得到明显的提升。主要原因在于原始表的字段多,数据量大,建立联合索引后,该统计业务的所有数据都可以从索引获取,不再需要进行原始表查询了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值