ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2022-03-18 17:07:08  阅读:186  来源: 互联网

标签:1.5 code epay 索引 数据量 mysql pay 优化 id


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

一个项目中,需要统计一年的账单数据(表中数据在将近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

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

标签:1.5,code,epay,索引,数据量,mysql,pay,优化,id
来源: https://blog.csdn.net/liaomingwu/article/details/103334213

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有