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 06 MySQL
MySQL 重写查询语句的三种策略
May 10 MySQL
MySQL 覆盖索引的优点
May 19 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
优化Mysql查询的示例
Apr 26 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
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
python del()函数用法
2013/03/24 Python
python中的多重继承实例讲解
2014/09/28 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
EJB的激活机制
2013/10/25 面试题
教师自我评价范例
2013/09/24 职场文书
工程预算与管理应届生求职信
2013/10/06 职场文书
初中化学教学反思
2014/01/23 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
音乐之声观后感
2015/06/04 职场文书
军训通讯稿范文
2015/07/18 职场文书
生产车间管理制度
2015/08/04 职场文书
环保建议书作文400字
2015/09/14 职场文书