MySQL 定位慢SQL
本文将介绍如何在 MySQL 中定位找到慢 SQL 语句。
一、查看 SQL 执行频率
可以通过以下命令查看服务器的状态信息。
1 |
|
其中,
[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 对语句的具体执行计划。