如何使用 MySQL 的 EXPLAIN 语句进行查询分析?
如何使用 MySQL 的 EXPLAIN 语句进行查询分析?
EXPLAIN
是 MySQL 提供的分析 SQL 查询执行计划的工具,用于了解查询语句的执行过程,帮助优化查询性能。
1. EXPLAIN 的使用方法
基本语法
EXPLAIN SELECT * FROM table_name WHERE conditions;
或者:
EXPLAIN FORMAT=JSON SELECT * FROM table_name WHERE conditions;
EXPLAIN
会返回查询的执行计划信息,包括涉及的表、索引的使用情况、扫描方式等。FORMAT=JSON
提供结构化的 JSON 格式信息,包含更详细的执行计划内容。
2. EXPLAIN 输出的字段解释
EXPLAIN
的输出包含多个字段,常见字段如下:
字段名 | 说明 |
---|---|
id | 查询中每个操作的标识符,查询的执行顺序从大到小。 |
select_type | 查询类型,如简单查询、子查询、联合查询等(SIMPLE 、PRIMARY 、SUBQUERY 等)。 |
table | 当前查询操作涉及的表名。 |
partitions | 表示使用的分区(如果有分区表)。 |
type | 访问类型,表示查询操作的效率,类型从好到差依次为:system > const > eq_ref > ref > range > index > ALL 。 |
possible_keys | 查询可能使用的索引。 |
key | 查询实际使用的索引。 |
key_len | 使用索引的字节长度,反映索引使用的精确性。 |
ref | 表示使用索引的比较列。 |
rows | MySQL 估计需要扫描的行数,行数越少,查询性能越高。 |
filtered | 表示返回结果占扫描行数的百分比,值越大越好。 |
Extra | 额外信息,如 Using index (覆盖索引)、Using where (条件过滤)、Using temporary (临时表)。 |
3. 示例分析
示例 1:简单查询
EXPLAIN SELECT * FROM orders WHERE customer_id = 1001;
输出示例:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | orders | ref | customer_id | customer_id | 4 | const | 10 | Using where; Using index |
- type:
ref
表示使用索引访问数据。 - key: 使用了
customer_id
索引。 - Extra:
Using where; Using index
表示通过索引过滤数据并直接返回结果,性能较优。
示例 2:范围查询
EXPLAIN SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';
输出示例:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | orders | range | order_date | order_date | 3 | NULL | 1500 | Using where |
- type:
range
表示索引范围扫描。 - rows: 扫描约 1500 行,查询效率较高。
- Extra:
Using where
表示查询条件在索引范围内过滤数据。
示例 3:子查询
EXPLAIN SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE country = 'USA');
输出示例:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | PRIMARY | orders | ref | customer_id | customer_id | 4 | const | 500 | Using where |
2 | SUBQUERY | customers | range | country | country | 20 | NULL | 100 | Using where; Using index |
- id: 子查询的
id
为 2,主查询的id
为 1,表示子查询先执行。 - Extra:
Using index
表示子查询的结果通过索引直接返回,性能较优。
示例 4:JOIN 查询
EXPLAIN SELECT o.* FROM orders o JOIN customers c ON o.customer_id = c.id WHERE c.country = 'USA';
输出示例:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | c | ref | country | country | 20 | const | 100 | Using where |
1 | SIMPLE | o | ref | customer_id | customer_id | 4 | c.id | 500 | Using where |
- 执行顺序: 表
c
的过滤条件先执行,然后通过customer_id
的索引关联表o
。 - 优化建议: 确保
country
和customer_id
字段上有合适的索引。
4. EXPLAIN 的常见优化点
优先使用合适的索引
- 查看
possible_keys
和key
,确保查询语句能命中预期的索引。
- 查看
优化扫描范围
- 避免
type
为ALL
或index
,优先通过ref
、range
等高效方式访问数据。
- 避免
减少扫描行数
- 查看
rows
字段,减少扫描的行数,降低查询的 I/O 成本。
- 查看
消除临时表和文件排序
- 如果
Extra
中出现Using temporary
或Using filesort
,尝试优化语句,避免使用临时表或文件排序。
- 如果
使用覆盖索引
- 确保查询可以通过索引直接返回所需数据,避免回表操作。
总结
EXPLAIN
是优化 MySQL 查询性能的重要工具,可以帮助我们理解查询的执行计划和潜在的性能问题。通过合理使用索引、优化查询语句、减少扫描范围,可以大幅提升查询效率。
如何使用 MySQL 的 EXPLAIN 语句进行查询分析?的更多相关文章
- mysql 常用 sql 语句 - 快速查询
Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互 1.1.1 mysql 连接 mysql.exe -hPup ...
- MySQL的explain语句分析
+----+-------------+-------+------------+------+---------------+-----+---------+------+------+------ ...
- MySQL中explain语句的使用
一.概述 在 MySQL 中,我们可以使用慢查询日志或者 show processlist 命令等方式定位到执行耗时较长的 SQL 语句,在这之后我们可以通过 EXPLAIN或者 DESC 命令获取 ...
- MySQL 的 EXPLAIN 语句及用法
在MySQL中 DESCRIBE 和 EXPLAIN 语句是相同的意思.DESCRIBE 语句多用于获取表结构,而 EXPLAIN 语句用于获取查询执行计划(用于解释MySQL如何执行查询语句). 通 ...
- 【Explain】mysql之explain详解(分析索引的最佳使用)
在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain 这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句 ...
- MySQL:explain 和 慢查询日志
1. 执行SQL时显示执行情况 explain + SQL语句 2. 强制使用索引 select * from t force index (a) where a between 1 ...
- PHP获取MySQL执行sql语句的查询时间
//计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function runtime($mode=0 ...
- (转载)PHP怎么获取MySQL执行sql语句的查询时间
(转载自CSDN) 方法一: //计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function ...
- sql server 最近执行语句统计查询分析
查询语句: select * from ( SELECT [RowNumber],DATEDIFF(second, StartTime, isnull(EndTime ,StartTime)) 执行时 ...
- MySQL索引,MySQL性能分析及explain的使用,分析SQL查询性能
可以使用explain来分析MySQL查询性能,举例如下: 1.使用explain语句去查看分析结果 如 explain select * from test1 where id=1; 会出现: id ...
随机推荐
- 两个半成品的ORM
只要是有点结构化的思想,不可能项目里一个sqlHelper 满天飞 到处写 ,最终你的c#代码还是得返回一个Class 才好操作,sqlhelper, datatable这种东西也只是临时将就一下,稍 ...
- 引领行业数字变革,天翼云出席IDC年度盛典暨颁奖典礼!
近日,2024 IDC中国年度盛典暨颁奖典礼在上海隆重开幕.天翼云出席大会数字工业行业峰会及金融行业峰会,分享了天翼云的智算布局及在行业数字化转型方面的技术探索和实践成果. 天翼云全面升级产品及生态矩 ...
- rbd常用的配置参数
本文分享自天翼云开发者社区<rbd常用的配置参数>,作者:l****n rbd的基本介绍 rbd的架构如下图所示: rbd采用CRUSH算法实现数据的随机分布.CRUSH算法,即Contr ...
- Linux下普通用户免密切换root
问题需求: Linux下普通用户doge免密切换root 问题解决: Linux下普通用户切换到root用户下,默认情况是需要输入密码很不方便,因此需要实现普通用户doge免密切换到root用户. 示 ...
- python 爬取博客访问量
一.代码 """ Version: Python3.5 Author: OniOn Site: http://www.cnblogs.com/TM0831/ Time: ...
- mysql之PreparedStatement的增删改
编写配置文件[db.properties]: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcStudy?useUni ...
- CF607B Zuma 题解
CF607B Zuma 不知道为什么你谷会评蓝,这不是很基础的区间DP吗. Problem - 607B - Codeforces 题意简述 消除回文子串的最小次数. 思路 对于区间\([i,j]\) ...
- 永久解决VSCode终端中文乱码问题
方法如下: 在VSCode中通过打开"文件"--"首选项"--"设置", 然后在"setting.json"中 添加以下 ...
- c++中bitset的常见用法
C++ 中的 bitset 是一个用于处理固定大小位序列的模板类,提供高效的位操作功能.以下是对其关键特性的详细介绍: 1. 声明与初始化 头文件:需包含 <bitset>. 声明:bit ...
- [国家集训队] happiness 题解
发现可以做如下建图: 对于前两组输入,从 \(s\) 向所有代表学生的点连一条边,容量为其学习文科的喜悦值:从所有代表学生的点向 \(t\) 连一条边,容量为其学习理科的最大值. 对于后四组输入,建两 ...