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
MySQL 使用SQL语句修改表名的实现
Apr 07 MySQL
Mysql 用户权限管理实现
May 25 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
Apr 29 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
MySQL数据库配置信息查看与修改方法详解
Jun 25 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
Sep 23 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
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
php解析xml方法实例详解
2015/05/12 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
基于Vue的文字跑马灯组件(npm 组件包)
2017/05/24 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
Python Flask异步发送邮件实现方法解析
2020/08/01 Python
python中sys模块是做什么用的
2020/08/16 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
宝信软件JAVA工程师面试经历
2012/08/19 面试题
心理健康课教学反思
2014/02/13 职场文书
党委班子剖析材料
2014/08/21 职场文书
行政文员实习自我鉴定范文
2014/09/14 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL
python 如何用terminal输入参数
2021/05/25 Python