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获取所有分类的前N条记录
May 07 MySQL
MySQL 分组查询的优化方法
May 12 MySQL
MYSQL主从数据库同步备份配置的方法
May 26 MySQL
带你学习MySQL执行计划
May 31 MySQL
浅谈MySQL user权限表
Jun 18 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
mysql 索引的数据结构为什么要采用B+树
Apr 26 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 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
Smarty中的注释和截断功能介绍
2015/04/09 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
javascript操作文本框readOnly
2007/05/15 Javascript
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
2010/10/01 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
vue实例的选项总结
2020/06/09 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
php使用递归与迭代实现快速排序示例
2014/01/23 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
安踏广告词改编版
2014/03/21 职场文书
市场营销调查计划书
2014/05/02 职场文书
乡镇安全生产目标责任书
2014/07/23 职场文书
新员工考核评语
2014/12/31 职场文书
活动经费申请报告
2015/05/15 职场文书
初中美术教学反思
2016/02/17 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP