数据库索引导致的性能问题分析

 

本期暴暴和大家分享我的一次性能调优经验,希望对大家有帮助。...



本期和大家分享暴暴的一次性能调优经验,希望对大家有帮助。

0x00 被测系统描述

被测系统是若干个的web接口。测试方法是通过LoadRunner发送Http post/get请求,给被测接口加压。

0x01 遇到问题

先测试的前面几个接口,接口性能都很稳定。但是在最后一个接口测试的时候,发现性能出现下降,并且加压时间越长,TPS越低,性能越差。暴暴整个人都不好了。

0x02 分析方法

方法一:重启系统

对整个架构各个层次节点的服务器进行重启,但是问题仍然存在;

方法二:验证其他接口性能是否仍然稳定

发现有部分接口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圈


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册