数据库索引导致的性能问题分析
本期暴暴和大家分享我的一次性能调优经验,希望对大家有帮助。...
本期和大家分享暴暴的一次性能调优经验,希望对大家有帮助。
0x00 被测系统描述
被测系统是若干个的web接口。测试方法是通过LoadRunner发送Http post/get请求,给被测接口加压。
0x01 遇到问题
先测试的前面几个接口,接口性能都很稳定。但是在最后一个接口测试的时候,发现性能出现下降,并且加压时间越长,TPS越低,性能越差。暴暴整个人都不好了。
方法一:重启系统
对整个架构各个层次节点的服务器进行重启,但是问题仍然存在;
方法二:验证其他接口性能是否仍然稳定
发现有部分接口TPS明显下降,但是仍然有部分接口性能稳定。通过对比其他接口和问题接口在报文流转路径上的区别,初步定为是Oracle可能出现了问题。
方法三:Oracle数据库监控
对问题接口进行加压,同时监控Oracle,分析AWR报告。
0x03 定位问题
通过分析AWR报告,发现有一条SQL查询语句消耗的时间比较长
select 。。。from tablename where id2=4
查看tablename,发现id是主键,已经在主键上建立了索引。id2也是唯一的,但是id2上没有建立索引。
另外,统计tablename里的数据量,发现在加压前大约有1W条记录,截止到统计数据为止,已经积累了90W多条数据,数据量急剧增长。
因此初步确认问题原因是没有对id2建立索引,随着数据量增加,导致全表查询效率越来越低。
0x04 解决问题
在tablename表的id2列建立索引。
重新测试该问题接口,发现TPS明显提高,且稳定。0x05 总结
本次性能调优过程,发现应用系统中如果根据某个条件进行查询,应该考虑是否需要在该列建立索引。
当然并不是建立越多索引,系统性能就越好,关于建立索引的度的问题,不在本文探讨范围,暴暴会在以后文章里专门介绍建立索引时需要考虑的事情。
【暴侃IT圈】
这可能是东半球最IN的公众号
关注 暴侃IT圈
微信扫一扫关注公众号