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 08 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
Mysql中存储引擎的区别及比较
Jun 04 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
MySQL 数据类型详情
Nov 11 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
mysql 体系结构和存储引擎介绍
May 06 MySQL
MySQL中order by的执行过程
Jun 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
去除php注释和去除空格函数分享
2014/03/13 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
走出JavaScript初学困境—js初学
2008/12/29 Javascript
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
prototype框架中美元符号$用法分析
2016/01/22 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
详解vue 图片上传功能
2019/04/30 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
python提取页面内url列表的方法
2015/05/25 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
Python 多进程原理及实现
2020/12/21 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
会计毕业生自我鉴定
2013/11/04 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
国庆节活动总结
2014/08/26 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
销售人员管理制度
2015/08/06 职场文书
ant design vue的form表单取值方法
2022/06/01 Vue.js