MySQL中EXPLAIN语句及用法


Posted in MySQL onMay 20, 2022

前言

在MySQL中 DESCRIBE 和 EXPLAIN 语句是相同的意思。DESCRIBE 语句多用于获取表结构,而 EXPLAIN 语句用于获取查询执行计划(用于解释MySQL如何执行查询语句)。

通过 EXPLAIN 语句可以帮助我们发现表格的哪些字段上需要建立索引,用于加速查询。也可以使用 EXPLAIN 检查优化器是否使用最优的顺序来连接表。

EXPLAIN 语法如下:

{EXPLAIN | DESCRIBE | DESC}
    tbl_name [col_name | wild]

{EXPLAIN | DESCRIBE | DESC}
    [explain_type]
    {explainable_stmt | FOR CONNECTION connection_id}

{EXPLAIN | DESCRIBE | DESC} ANALYZE [FORMAT = TREE] select_statement

explain_type: {
    FORMAT = format_name
}

format_name: {
    TRADITIONAL
  | JSON
  | TREE
}

explainable_stmt: {
    SELECT statement
  | TABLE statement
  | DELETE statement
  | INSERT statement
  | REPLACE statement
  | UPDATE statement
}

1、获取表结构

DESCRIBE 是 SHOW COLUMNS 的快捷方式,也可以用于显示View 的信息,SHOW COLUMNS提供了更多的列信息。

SHOW CREATE TABLE, SHOW TABLE STATUS, SHOW INDEX 也用于提供表信息。

DESCRIBE 默认显示所有列的信息,如果指定了 col_name 将只显示该列的信息。wild 用于指定模式串,可以使用SQL通配符 % 和 _。如果指定了 wild ,将显示与模式串匹配的列信息。如果没有特殊字符(空格或其它特殊字符),模式串不需要使用引号括起来。

DESCRIBE City;
# 等同于
SHOW COLUMNS FROM City;

2、获取执行计划信息

  • DESCRIBE 可以查询 SELECT, DELETE, INSERT, REPLACE, UPDATE 的执行信息。MySQL 8.0.19 也可以查询 TABLE 语句。
  • MySQL从优化器获取可解释语句的执行计划信息,包括参与的表、顺序等信息。
  • 如果使用FOR CONNECTION connection_id语句,MySQL显示该命名连接的执行计划。
  • EXPLAIN 语句产生的执行计划信息可以通过 SHOW WARNINGS 显示。
  • FORMAT 选项用于指定输出格式,TRADITIONAL 是默认的输出格式,以表格形式显示。

EXPLAIN 需要的权限与被执行解释语句的权限相同,解释 view 语句时需要 SHOW VIEW 权限,EXPLAIN ... FOR CONNECTION需要 PROCESS 权限。
可以使用 SELECT STRAIGHT_JOIN 来告诉优化器使用 SELECT 指定的连接顺序。

3、使用 EXPLAIN ANALYZE 获取信息

MySQL 8.0.18 推荐使用 EXPLAIN ANALYZE,该语句可以输出语句的执行时间和以下信息

  • 预计执行时间
  • 预计返回的行数
  • 返回第一行的时间
  • 迭代器的执行时间,单位毫秒
  • 迭代器返回的行数
  • 执行循环的次数

查询信息以 TREE 的形式输出,每个节点代表一个迭代器。EXPLAIN ANALYZE 可以用于 SELECT 语句,以及多表的 UPDATE 和 DELETE 语句,MySQL 8.0.19 以后也可以用于 TABLE 语句。EXPLAIN ANALYZE 不能使用 FOR CONNECTION 。

MySQL 8.0.20 以后可以通过 KILL QUERY 或 CTRL-C 终止该语句的执行。

mysql> EXPLAIN ANALYZE SELECT * FROM t1 JOIN t2 ON (t1.c1 = t2.c2)\G
*************************** 1. row ***************************
EXPLAIN: -> Inner hash join (t2.c2 = t1.c1)  (cost=4.70 rows=6)
(actual time=0.032..0.035 rows=6 loops=1)
   -> Table scan on t2  (cost=0.06 rows=6)
(actual time=0.003..0.005 rows=6 loops=1)
   -> Hash
       -> Table scan on t1  (cost=0.85 rows=6)
(actual time=0.018..0.022 rows=6 loops=1)

mysql> EXPLAIN ANALYZE SELECT * FROM t3 WHERE i > 8\G
*************************** 1. row ***************************
EXPLAIN: -> Filter: (t3.i > 8)  (cost=1.75 rows=5)
(actual time=0.019..0.021 rows=6 loops=1)
   -> Table scan on t3  (cost=1.75 rows=15)
(actual time=0.017..0.019 rows=15 loops=1)

mysql> EXPLAIN ANALYZE SELECT * FROM t3 WHERE pk > 17\G
*************************** 1. row ***************************
EXPLAIN: -> Filter: (t3.pk > 17)  (cost=1.26 rows=5)
(actual time=0.013..0.016 rows=5 loops=1)
   -> Index range scan on t3 using PRIMARY  (cost=1.26 rows=5)
(actual time=0.012..0.014 rows=5 loops=1)

总结 

到此这篇关于MySQL中EXPLAIN语句及用法的文章就介绍到这了!


Tags in this post...

MySQL 相关文章推荐
mysql部分操作
Apr 05 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
mysql insert 存在即不插入语法说明
Mar 25 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
MySql重置root密码 --skip-grant-tables
Apr 11 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
MySQL中JOIN连接的基本用法实例
Jun 05 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 MySQL
Mysql 一主多从的部署
May 20 #MySQL
mysql 排序失效
May 20 #MySQL
MySQL 自动填充 create_time 和 update_time
May 20 #MySQL
MySQL数据库 任意ip连接方法
May 20 #MySQL
MySQL GTID复制的具体使用
May 20 #MySQL
单机多实例部署 MySQL8.0.20
May 15 #MySQL
MySQL中的全表扫描和索引树扫描
You might like
PHP4实际应用经验篇(9)
2006/10/09 PHP
如何用php获取文件名后缀
2013/06/09 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
Mootools 1.2教程 事件处理
2009/09/15 Javascript
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
Vue如何实现监听组件原生事件
2020/07/03 Javascript
vue点击按钮实现简单页面的切换
2020/09/08 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
2020/11/12 Javascript
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
Python验证企业工商注册码
2015/10/25 Python
python表格存取的方法
2018/03/07 Python
django 修改server端口号的方法
2018/05/14 Python
Python tkinter label 更新方法
2018/10/11 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
旅游管理毕业生自荐信
2013/11/05 职场文书
活动策划邀请函
2014/02/06 职场文书
函授自我鉴定范文
2014/02/06 职场文书
辩论赛主持词
2014/03/18 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
施工单位安全责任书
2014/07/24 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
青岛海底世界导游词
2015/02/11 职场文书
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL