MySql执行计划(Explain关键字详解)

2024-09-01 04:52

本文主要是介绍MySql执行计划(Explain关键字详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 预备知识
      • 学习本内容的前提必须了解
    • 1.什么是Explain?
    • 2.如何使用Explain?
    • 3.explain字段详解
      • 3.1、ID字段
        • (情况1)、id值不同:
        • (情况2)、id值相同:
        • (情况3)、id列为null:
        • (情况4)、子查询
          • 优化后
      • 3.2、select_type字段:表示那个是主要的查询
        • 1.simmple:
        • 2.primary:
        • 3.derived:
      • 3.3、table 字段
      • 3.4、type字段
        • 1.system:
        • 2.const:
        • 3.eq_ref:
        • 4.ref:
        • 5.fulltext:
        • 6.ref_or_null:
        • 7.index_merge:
        • 8.unique subquery:
        • 9.index subquery:
        • 10.range:
        • 12.all:
        • 13.NULL:
      • 3.5. possible_key 字段
      • 3.6.key字段
      • 3.7.key_len 字段
        • key_len的计算规则:
        • 注意:
      • 3.8.ref 字段
      • 9.rows字段
      • 10 extra 字段
        • 1.no tables used:
        • 2.impossible where:
        • 3.Using where:
        • 4.Using filesort:
        • 5.Using temporary:
        • 6.Using index:
        • 7.Using index condition:
        • 8.Using join buffer:
        • 9.select tables optimized away:
        • 10.distinct:
      • 11. filterd字段
      • 12. 关于MySQL执行计划的局限性

在这里插入图片描述

预备知识

学习本内容的前提必须了解

  • SQL查询(含复杂子查询)
  • 索引原理

1.什么是Explain?

explain即查看执行计划,使用explain关键字可以莫拟优化器执行SQL查询语句,从而知道MYSQL是如何处理SQL语句的。

explain的作用是用来 分析查询语句的性能瓶颈

执行计划是SQL语句经过查询分析器后得到的 抽象语法树 和 相关表的统计信息 作出的一个查询方案,这个方案是由查询优化器自动分析产生的。由于是动态数据采样统计分析出来的结果,所以可能会存在分析错误的情况,也就是存在执行计划并不是最优情况。

2.如何使用Explain?

explain的使用非常简单:在我们的select查询语句前加上explain关键字即可,如:

explain select * from emp;

我们主要是通过explain返回的信息,分析SQL是否存在性能问题。explain返回哪些信息?

  1. 表的读取顺序
  2. 数据读取操作的操作类型
  3. 哪些索引可以使用
  4. 哪些索引被实际使用
  5. 表之间的引用
  6. 每张表有多少行被优化器查询
  7. .……

3.explain字段详解

explain的字段组成如下!

在这里插入图片描述


在这里插入图片描述


3.1、ID字段

id字段的编号就是select 的序列号,也可以理解为SQL执行顺序的标识,一般来说有子查询中几个select 就有几个id:

  • id值不同: 如果是只查询,id的序号会递增,id值越大优先级越高,越先被执行;

  • id值相同: 从上往下依次执行;

  • id列为null: 表示这是一个结果集,不需要使用它来进行查询。这通常意味着该行是提示信息,而不是具体的查询执行计划的一部分。这种情况可能发生在使用UNION语句时
    每个id的表示一趟独立的查询,一个sql的查询趟数越少越好!


(情况1)、id值不同:

如果是只查询,id的序号会递增,id值越大优先级越高,越先被执行

EXPLAIN
SELECT * FROM emp WHERE dept_id IN(
SELECT dept_id FROM dept WHERE dept id = 30)OR emp_id = 7499

在这里插入图片描述


(情况2)、id值相同:

从上往下依次执行;

EXPLAIN SELECT * FROM emp e JOIN dept d ON e.dept_id = d.dept_id

在这里插入图片描述


(情况3)、id列为null:

表示这是干个结果集,不需要使用它来进行查询。这通常意味着该行是提示信息,而不是具体的查询执行计划的一部分。这种情况可能发生在使用UNION语句时,

EXPLAIN SELECT dept_id FROM emp
UNION
SELECT dept_id FROM dept;

在这里插入图片描述


(情况4)、子查询

对于子查询有几个select 就有几个id?

查询优化器可能会对涉及子查询的查询语句进行重写,优化器在看到子查询后判断能够变为多表连接以降低复杂度(O(n^2)->O(n)),重写后的sql变成了一个select,所以查询结果仍然是一个id。

EXPLAIN
#子查询:两个select
SELECT * FROM emp WHERE dept_id IN(SELECT dept_id FROM dept WHERE dept id = 30
);
#上面的子查询可能优化为等价的多表连接查询:一个select
SELECT * FROM emp e JOIN dept d ON e.dept_id = d.dept_id WHERE d.dept_id = 30;

在这里插入图片描述

优化后

在这里插入图片描述


3.2、select_type字段:表示那个是主要的查询

这个字段主要是查询的类型,用于区分普通查询、联合查询、子查询等复杂的查询;

1.simmple:

最简单的查询,表示查询中不包括union操作或者子查询。位于最外层的查询的select type即为simple,且只有一个;

EXPLAIN SELECT * FROM emp;
2.primary:

需要union查询的select位于最外层的查询的select,位于最外层的查询的select_type即为primary 且只有一个。

#union操作
EXPLAIN SELECT dept_id FROM emp
UNION
SELECT dept_id FROM dept;
#子查询
EXPLAIN
SELECT * FROM emp WHERE dept id IN(SELECT dept_id FROM dept WHERE dept id =

这篇关于MySql执行计划(Explain关键字详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125997

相关文章

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

MySQL日志UndoLog的作用

《MySQL日志UndoLog的作用》UndoLog是InnoDB用于事务回滚和MVCC的重要机制,本文主要介绍了MySQL日志UndoLog的作用,文中介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、Undo Log 的作用二、Undo Log 的分类三、Undo Log 的存储四、Undo

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直

MySQL数据目录迁移的完整过程

《MySQL数据目录迁移的完整过程》文章详细介绍了将MySQL数据目录迁移到新硬盘的整个过程,包括新硬盘挂载、创建新的数据目录、迁移数据(推荐使用两遍rsync方案)、修改MySQL配置文件和重启验证... 目录1,新硬盘挂载(如果有的话)2,创建新的 mysql 数据目录3,迁移 MySQL 数据(推荐两

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格