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 11 MySQL
详解mysql三值逻辑与NULL
May 19 MySQL
mysql在项目中怎么选事务隔离级别
May 25 MySQL
MySql存储过程之逻辑判断和条件控制
May 26 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
mysql脏页是什么
Jul 26 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
MYSQL常用函数介绍
May 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
中东人咖啡哲学
2021/03/03 咖啡文化
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
php无限遍历文件夹示例分享
2014/03/04 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
Ext 今日学习总结
2010/09/19 Javascript
在JavaScript里防止事件函数高频触发和高频调用的方法
2014/09/06 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
javascript基础知识
2016/06/07 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
JavaScript中数组去重的5种方法
2020/07/04 Javascript
js实现查询商品案例
2020/07/22 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
Python 流程控制实例代码
2009/09/25 Python
Python实现单词翻译功能
2017/06/06 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
python实现感知机模型的示例
2020/09/30 Python
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
保密工作目标责任书
2014/07/28 职场文书
学习三严三实心得体会
2014/10/13 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
Python实现学生管理系统(面向对象版)
2021/06/24 Python
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
详解flex:1什么意思
2022/07/23 HTML / CSS