背景
项目赶无法进行性能压测
测试环境进行功能测试时并发量不高,即使单个请求变慢也不会发生超时现象;
测试环境数据库表的数据量较生产环境小很多,所以单个查询操作比生产快很多,这样压力测试中请求也极少超时。
业务逻辑
方案
非侵入式
mysql自身收集的数据进行分析
开启数据库慢查询,这种方式可以查看慢sql,修改参数slow_query_log 和slow_query_log_file后,然后重启MySQL服务器,如下所示:
slow_query_log =1
slow_query_log_file=/tmp/mysql_slow.logjvm-sandbox 录制mybaits流量,修改MybatisProcessor插件,捕获监听服务的sql,然后报送到日志服务器
侵入式
Mybatis可以使用 AbstractSqlParserHandler监听对象,监听上下文这种方式,可以捕获到执行的sql,自己控制执行时间监听,然后报送日志到服务器端
Druid 可以使用 FilterEventAdapter 监听对象,监听上下文这种方式,可以捕获到执行的sql,自己控制执行时间监听,然后报送日志到服务器端,也可以利用 druid 开启慢日志查询,可以在控制太查看sql日志
EXPLAIN结果分析
通过explain我们可以获得以下信息:
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查
执行计划各字段含义
type所显示的是查询使用了哪种类型,type包含的类型包括如下图所示的几种,从好到差依次是
system > const > eq_ref > ref > range > index > allpossible_keys 和 key
possible_keys 显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。
key实际使用的索引,如果为NULL,则没有使用索引。(可能原因包括没有建立索引或索引失效)
key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,也就是说,用的越少越好