MySQL中EXPLAIN语句及用法实例

 更新时间:2022年05月20日 12:33:33   作者:永不停转  
我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,下面这篇文章主要给大家介绍了关于MySQL中EXPLAIN语句及用法的相关资料,需要的朋友可以参考下

前言

在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语句及用法的文章就介绍到这了,更多相关MySQL EXPLAIN语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL文件权限存在的安全问题和解决方案

    MySQL文件权限存在的安全问题和解决方案

    MySQL文件权限是用来控制用户对数据库文件以及目录的操作权限,在MySQL中,这些权限通常由系统管理员分配,通过GRANT和REVOKE语句进行管理,本文给大家介绍了MySQL文件权限存在的安全问题和解决方案,需要的朋友可以参考下
    2024-07-07
  • MySQL触发器自动智能化的数据维护

    MySQL触发器自动智能化的数据维护

    这篇文章主要介绍了MySQL触发器自动智能化的数据维护,触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段
    2022-07-07
  • Centos7.5安装mysql5.7.24二进制包方式部署

    Centos7.5安装mysql5.7.24二进制包方式部署

    这篇文章主要介绍了Centos7.5安装mysql5.7.24二进制包方式部署,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • 实战MySQL升级的最佳方法

    实战MySQL升级的最佳方法

    这篇文章给大家从理论到实战详细分享了MySQL升级的最佳方法,有需要的朋友跟着学习操作下吧。
    2017-12-12
  • 简述MySQL主键和外键使用及说明

    简述MySQL主键和外键使用及说明

    MySQL通过外键约束来保证表与表之间的数据的完整性和准确性,本文主要介绍了简述MySQL主键和外键使用及说明,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 从创建数据库到存储过程与用户自定义函数的小感

    从创建数据库到存储过程与用户自定义函数的小感

    从创建数据库到存储过程与用户自定义函数的小感,深入的学习mysql
    2011-09-09
  • MySQL重复数据提取最新一条技术方法详解

    MySQL重复数据提取最新一条技术方法详解

    在MySQL数据库中清除重复数据是一项常见的任务,下面这篇文章主要给大家介绍了关于MySQL重复数据提取最新一条的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • 详解MySQL和Redis如何保证数据一致性

    详解MySQL和Redis如何保证数据一致性

    MySQL与Redis都是常用的数据存储和缓存系统,为了提高应用程序的性能和可伸缩性,很多应用程序将MySQL和Redis一起使用,其中MySQL作为主要的持久存储,而Redis作为主要的缓存,那么本文就给大家介绍一下MySQL和Redis如何保证数据一致性,需要的朋友可以参考下
    2023-08-08
  • MySQL数据库安装后服务无法启动的解决办法

    MySQL数据库安装后服务无法启动的解决办法

    作为一名程序猿,必不可少的便是和mysql打交道,那当mysql故障,下面这篇文章主要给大家介绍了关于MySQL数据库安装后服务无法启动的解决办法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 详解MySQL 5.7 MGR单主确定主节点方法

    详解MySQL 5.7 MGR单主确定主节点方法

    这篇文章主要介绍了详解MySQL 5.7 MGR单主确定主节点方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论