暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何进行Mysql慢查询测试

懒人实录 2021-04-26
954

背景

  • 项目赶无法进行性能压测

  • 测试环境进行功能测试时并发量不高,即使单个请求变慢也不会发生超时现象;

  • 测试环境数据库表的数据量较生产环境小很多,所以单个查询操作比生产快很多,这样压力测试中请求也极少超时。

业务逻辑

方案

非侵入式
  • mysql自身收集的数据进行分析 
    开启数据库慢查询,这种方式可以查看慢sql,修改参数slow_query_log 和slow_query_log_file后,然后重启MySQL服务器,如下所示: 
    slow_query_log =1 
    slow_query_log_file=/tmp/mysql_slow.log

  • jvm-sandbox 录制mybaits流量,修改MybatisProcessor插件,捕获监听服务的sql,然后报送到日志服务器

侵入式

  • Mybatis可以使用 AbstractSqlParserHandler监听对象,监听上下文这种方式,可以捕获到执行的sql,自己控制执行时间监听,然后报送日志到服务器端

  • Druid 可以使用 FilterEventAdapter 监听对象,监听上下文这种方式,可以捕获到执行的sql,自己控制执行时间监听,然后报送日志到服务器端,也可以利用 druid 开启慢日志查询,可以在控制太查看sql日志

EXPLAIN结果分析

通过explain我们可以获得以下信息:

  • 表的读取顺序

  • 数据读取操作的操作类型

  • 哪些索引可以使用

  • 哪些索引被实际使用

  • 表之间的引用

  • 每张表有多少行被优化器查

执行计划各字段含义

  • type所显示的是查询使用了哪种类型,type包含的类型包括如下图所示的几种,从好到差依次是 
    system > const > eq_ref > ref > range > index > all

  • possible_keys 和 key

    • possible_keys 显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。

    • key实际使用的索引,如果为NULL,则没有使用索引。(可能原因包括没有建立索引或索引失效)

  • key_len 
    表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。

  • rows 
    根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,也就是说,用的越少越好

文章转载自懒人实录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论