如何使用 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 ...
随机推荐
- String、StringBuffer、StringBuilder三者的异同
/*String.StringBuffer.StringBuilder三者的异同?String:不可变的字符序列:底层使用char[]存储StringBuffer:可变的字符序列:线程安全的,效率低: ...
- 一个基于 C# 开源的第三方 OAuth2 授权登录整合库
前言 在我们的开发工作中有可能会对接过各种各样的第三方平台的登录授权,来获取用户的相关账号信息(如:微信登录.支付宝登录.飞书登录.钉钉登录.GitHub登录等等).今天大姚给大家推荐一个基于 C# ...
- DBeaver出现“Public Key Retrieval is not allowed”错误的解决办法
1.问题描述 我们在使用DBeaver连接MySql的时候,可能会出现"Public Key Retrieval is not allowed"的错误提示,如下图所示: 2.解决办 ...
- 记一次golang项目context引发的OOM故障
之前写过一篇一种基于etcd实践节点自动故障转移的思路, 程序经历过一次线上进程内存持续上涨终OOOM的小事故, 本次技术复盘导致本次内存泄露的完整起因. 提炼代码: 业务函数etcdWatchLoo ...
- keycloak~refresh_token的标准化
内容大纲 refresh_token作用 使用方法 refresh_token规范 keycloak开启refresh_token的限制 refresh_token时的错误汇总 keycloak中re ...
- 探秘Transformer系列之(7)--- embedding
探秘Transformer系列之(7)--- embedding 0x00 概要 在Transformer中,把每个 Token(对应离散的输入数据,如单词或符号)映射到高维稠密向量空间的工作是由嵌入 ...
- php站点导入大mysql文件(linux系统)
问题描述:站点数据多,mysql导出后大于1G,使用phpmyadmin,导入一半报错,白白浪费等待时间,使用navicat 导入,执行时间过长提示错误 解决思路:1.拆分mysql文件,分批次导入, ...
- AI回答:一个简洁的php中间件类
<?php class MiddlewareStack { private $middlewares = []; private $request; private $response; /** ...
- Selenium KPI接口 iframe切换
应用场景: 在编写脚本的时候,经常会发现最熟悉的错误"元素定位不到",此时如果你查看页面元素,有可能你会发现元素在>标签对之间. 此时,我们只有先将代码驱动切换到frame内 ...
- nginx 部署vue http、https
nignx配置文件 server { listen 80; server_name your_domain.com; return 301 https://$server_name$request_u ...