使用性能分析工具定位SQL执行慢的原因

249 阅读3分钟

数据库服务器的优化步骤

image.png

当我们发现执行 SQL 时存在不规则延迟或卡顿的时候,就可以采用分析工具帮我们定位有问题的 SQL,这三种分析工具你可以理解是 SQL 调优的三个步骤:慢查询、EXPLAIN 和 SHOW PROFILE。

使用慢查询定位执行慢的 SQL

查看慢查询是否开启:

show variables like '%slow_query_log';
set global slow_query_log='ON';

slow_query_log_file:慢查询日志目录。

可以使用 MySQL 自带的 mysqldumpslow 工具统计慢查询日志(这个工具是个 Perl 脚本,你需要先安装好 Perl)。

mysqldumpslow 命令的具体参数如下:

  • -s:采用 order 排序的方式,排序方式可以有以下几种。分别是 c(访问次数)、t(查询时间)、l(锁定时间)、r(返回记录)、ac(平均查询次数)、al(平均锁定时间)、ar(平均返回记录数)和 at(平均查询时间)。其中 at 为默认排序方式。
  • -t:返回前 N 条数据 。
  • -g:后面可以是正则表达式,对大小写不敏感。

比如,按照查询时间排序,查看前两条 SQL 语句,这样写即可:

perl mysqldumpslow.pl -s t -t 2 "slow.log"

使用 EXPLAIN 查看执行计划

SQL 执行的顺序是根据 id 从大到小执行的,也就是 id 越大越先执行,当 id 相同时,从上到下执行。

数据表的访问类型所对应的 type 列是我们比较关注的信息。type 可能有以下几种情况:

image.png

all 是最坏的情况,因为采用了全表扫描的方式。index 和 all 差不多,只不过 index 对索引表进行全扫描,这样做的好处是不再需要对数据进行排序,但是开销依然很大。

如果我们在 Extral 列中看到 Using index,说明采用了索引覆盖,也就是索引可以覆盖所需的 SELECT 字段,就不需要进行回表,这样就减少了数据查找的开销。

我们需要尽量让 SQL 查询可以使用到 range 这一级别及以上的 type 访问方式。

ref:非唯一索引或唯一索引非唯一前缀

const 是与常量进行比较,查询效率会更快,而 eq_ref 通常用于多表联查中。

如果两表关联查询,可以这样理解:

  1. ref - 双层循环,直到找出所有匹配。
  2. eq_ref - 双层循环,借助索引的唯一性,找到匹配就马上退出内层循环。
  3. const: 单层循环。

使用 SHOW PROFILE 查看 SQL 的具体执行成本

查看profiling是否开启

show variables like 'profiling';
set profiling = 'ON';

查看当前会话都有哪些 profiles,使用下面这条命令:

show profiles;

如果我们想要查看上一个查询的开销,可以使用:

 show profile;

查看指定query id的开销:

show profile for query 2

不过 SHOW PROFILE 命令将被弃用,我们可以从 information_schema 中的 profiling 数据表进行查看。

SELECT * from information_schema.profiling where query_id=2

此文章为4月Day26学习笔记,内容来源于极客时间《SQL必知必会》