性能测试中数据库索引和MySQL数据库慢SQL问题的定位和分析【杭州多测师】【杭州多测师_王sir】
一、出现慢SQL的原因:
1)没有索引或者没有用到索引(查询慢最常见的问题,是程序设计的缺陷)
2)I/O吞吐量小,形成了瓶颈效应。
3)没有创建计算列导致查询不优化。
4)内存不足
5)网络速度慢
6)查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
7)锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
8)查询语句不好,没有优化
二、怎么对慢SQL进行优化
1)恰当地使用索引
必要时建立多级索引,分析执行计划,通过表数据统计等方式协助数据库走正确的查询方式,该走索引就走索引,该走全表扫描就走全表扫描;
2)对查询进行优化,尽可能避免全表扫描首先考WHERE 及ORDER BY涉及列上建立索引
3)数据库表的大字段剥离假如一个表的字段数有100多个,拆分字段,保证单条记录的数据量很小
4、字段冗余减少跨库查询或多表连接操作
5、查询时不要返回不需要的行、列
6、减少SQL中函数运算与其它计算
7、升级硬件
8、提高网速
9、扩大服务器的内存
10、增加服务器 CPU个数
三、MySQL出现慢SQL的案例分析==》导致数据库性能问题
TPS很低、响应时间比较长然后数据库服务器的CPU特别搞接近100%、但是应用服务器的负载比较低
索引:是MySQL数据库中一列或者多列的值进行排序的结构、使用索引可以快速访问数据库中的特定信息、有点像书的目录
分析:
数据库服务器CPU高一般都是SQL执行效率低导致的
1)数据库缺少一些索引
2)索引不生效
3)SQL语句写的不够优化
1、采用10个并发、持续300秒、在Linux服务器用jmeter -n -t test.jmx去压测
2、服务器的CPU空闲99%-100%、TPS达到300/sec左右、但是数据库服务器CPU差不多达到了100%、应用服务器的负载是比较低的
3、通过如下的方法排查MySQL数据库的可能存在的慢SQL ==》性能测试中MySQL数据库慢查询使用方法==》https://www.cnblogs.com/xiaoshubass/p/16754441.html
4、explain SQL语句发现 ==》rows达到20000多次说明需要找2万多次才能查询到结果、然后type也是all说明是使用了性能最差的全表扫描 ==》一般这种全表扫描是最不建议去使用的
5、然后开始给没有加索引的字段加上索引、把其中的一个字段name加上索引、索引的类型可以改为unique这个是唯一索引、字段里面的值是不能重复的、如果需要重复的可以选择索引类型为:normal、但是性能没有unique那么好
6、加完之后发现type从all变成了const、表中只有一个匹配行、从性能最差的类型变成了性能最好的type类型了
7、然后在去Linux服务器执行jmeter脚本进行压测、发现tps能达到20000了、CPU服务器空闲也剩了40%左右 ==》服务器的性能和能支持多少并发关系不大==》衡量服务器的性能只能是通过tps和响应时间来衡量==》性能好的服务器很少的并发也可以达到很高的tps
8、然后在把索引的类型unique改为normal、type从const变为了ref、tps瞬间变为了17000多、少了3000多的tps
通过Navicat连接上MySQL数据库然后在sql语句前加上explain,可以分析这条sql语句的执行情况
explain select * from student where name = xxx
Type列可能的值
Const:表中只有一个匹配行,用到primary key或unique key ==》性能最好
Eq_ref:唯一性索引扫描,key的所有部分被连接联接查询使用,且key是unique或primary key
ref:非唯一性索引扫描,或只使用了联合索引的最左前缀
Range:索引范围扫描,在索引列上进行给定范围内的检索,如between,in(1,100) Index:遍历索引...
All:全表扫描 ==》性能最差
Prossible key:使用哪个索引能找到行
Keys:sql语句使用的索引
rows:mysql 根据索引选择情况,估算查找数据所需读取的行数
接口响应过慢的原因排查
排查的顺序:
1、确定是哪个接口存在性能问题
2、确定这个接口的内部逻辑是怎样的,做了哪些事情
3、分析接口存在性能问题的根本原因
4、寻找确立优化方案
5、回归验证方案效果
接口慢排查:
一般会从以下几个方面入手:
1.是不是资源层面的瓶颈,硬件、配置环境之类的问题
2.针对查询类接口,是不是没有添加缓存,如果加了,是不是热点数据导致负载不均衡
3.是不是有依赖于第三方接口,导致因第三方请求拖慢了本地请求
4.是不是接口涉及业务太多,导致程序执行跑很久
5.是不是sql层面的问题导致的数据等待加长,进而拖慢接口
6.网络层面的原因?带宽不足?DNS解析慢
7.确实是代码质量差导致的,如出现内存泄漏,重复循环读取之类