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 07 MySQL
Idea连接MySQL数据库出现中文乱码的问题
Apr 14 MySQL
详解MySQL的半同步
Apr 22 MySQL
MySQL 自定义变量的概念及特点
May 13 MySQL
Mysql 用户权限管理实现
May 25 MySQL
浅谈MySQL 亿级数据分页的优化
Jun 15 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
MySQL数据库索引的最左匹配原则
Nov 20 MySQL
mysql使用 not int 子查询隐含陷阱
Apr 12 MySQL
MySQL创建管理RANGE分区
Apr 13 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
MySQL自定义函数及触发器
Aug 05 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
jQuery实现购物车表单自动结算效果实例
2015/08/10 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
python通过post提交数据的方法
2015/05/06 Python
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
python开发之list操作实例分析
2016/02/22 Python
利用Python生成文件md5校验值函数的方法
2017/01/10 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
一体化教学实施方案
2014/05/10 职场文书
感恩节活动策划方案
2014/05/16 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
英镑符号 £
2022/02/17 杂记
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server
spring boot实现文件上传
2022/08/14 Java/Android