MySQL 定位慢SQL

本文将介绍如何在 MySQL 中定位找到慢 SQL 语句。

一、查看 SQL 执行频率

可以通过以下命令查看服务器的状态信息。

1
SHOW [SESSION | GLOBAL] GLOBAL STATUS;

其中,

  • [SESSION | GLOBAL] 表示显示 “会话级 | 全局级” 统计结果,如果不填写则默认显示会话级统计结果

二、定位低效率执行 SQL

可以通过以下两种方式定位执行效率低的 SQL 语句:

  • 慢查询日志:通过慢查询日志定位执行效率较低的 SQL 语句

    如果希望开启慢查询日志,应该用 --log-slow-queries[=file_name] 选项启动,MySQL 会将所有执行时间超过 long_query_time 的 SQL 语句写入日志文件中

  • show processlist:可以通过该语句查看当前 MySQL 正在进行的线程,包括线程状态、是否锁表等

三、分析执行计划

1. EXPLAIN

可以通过 EXPLAIN 获取 MySQL 对语句的执行计划。

2. EXPLAIN - 结果

SELECT 语句的执行计划查询结果说明如下:

3. EXPLAIN - 结果 - type

type 表示访问类型,和查询性能相关,十分重要

type 可取值为:

  • NULL:表示不访问任何表、索引,直接返回结果

    发生在不查询表,只是调用 MySQL 函数的情况:

  • system:const 的特例,当表中只有一条数据时

  • const:表示通过索引唯一地确定某一行数据

  • ref:使用了不唯一的索引(非主键、非 unique),需要查询所有索引对应的行数据

  • range:索引范围扫描;与 index 相比,它有范围限制,并不是全表扫描

    例如:

    1
    SELECT * FROM `sys_user` WHERE id > 1000
  • index:索引全扫描;另一种形式的全表扫描,只不过依据索引扫描

  • all:全表扫描

四、查看执行详情

可以通过 SHOW PROFILE 查看特定语句的执行详情,从而可以查看 SQL 执行时的具体情况。

五、查看优化器执行计划

可以通过 trace 查看 MySQL 对语句的具体执行计划。

参考