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 22 MySQL
JDBC连接的六步实例代码(与mysql连接)
May 12 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
详解MySQL多版本并发控制机制(MVCC)源码
Jun 23 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
MySQL笔记 —SQL运算符
Jan 18 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
MySQL多表查询机制
Mar 17 MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
MySql按时,天,周,月进行数据统计
Aug 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
php防注
2007/01/15 PHP
php foreach 使用&(与运算符)引用赋值要注意的问题
2010/02/16 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
剖析Python的Twisted框架的核心特性
2016/05/25 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
CSS3实现点击放大的动画实例代码
2017/02/27 HTML / CSS
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
药剂专业学生求职信范文
2013/12/28 职场文书
女方回门宴答谢词
2014/01/14 职场文书
表彰会主持词
2014/03/26 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
学位证书委托书
2014/09/30 职场文书
入党个人总结范文
2015/03/02 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
HTTP中的Content-type详解
2022/01/18 HTML / CSS