首页 > 其他分享 >explain详解

explain详解

时间:2023-03-16 12:33:55浏览次数:54  
标签:column explain 索引 详解 key table ref SELECT

一、explain输出列

Column Meaning 意义
id The identifierSELECT SELECT的序列号
select_type The typeSELECT SELECT的类型
table The table for the output row 输出行的表
partitions The matching partitions 匹配的分区
type The join type 联接类型
possible_keys The possible indexes to choose 供选择的可能索引
key The index actually chosen 实际选择的索引
key_len The length of the chosen key 所选键的长度
ref The columns compared to the index 与索引比较的列
rows Estimate of rows to be examined 要检查的行的估计值
filtered Percentage of rows filtered by table condition 按表条件筛选的行百分比
Extra Additional information 其他信息

二、输出列详解

1.id

SELECT的序列号。

2.select_type

select_typeValue Meaning 意义
SIMPLE Simple SELECT(not using UNION or subqueries) 简单SELECT(未使用UNION或子查询)
PRIMARY Outermost SELECT 最外层SELECT
UNION Second or later SELECT statement in a UNION UNION中的第二个或后面的SELECT语句
DEPENDENT UNION Second or later SELECT statement in a UNION, dependent on outer query UNION中的第二个或后面的SELECT语句,取决于外部查询
UNION RESULT Result of a UNION UNION的结果
SUBQUERY First SELECT in subquery 子查询中的第一个SELECT
DEPENDENT SUBQUERY First SELECT in subquery, dependent on outer query 子查询中的第一个SELECT,取决于外部查询
DERIVED Derived table 派生表
DEPENDENT DERIVED Derived table dependent on another table 依赖于另一个表的派生表
MATERIALIZED Materialized subquery 具体化子查询
UNCACHEABLE SUBQUERY A subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query 无法缓存其结果且必须为外部查询的每一行重新求值的子查询
UNCACHEABLE UNION The second or later SELECT in a UNION that belongs to an uncacheable subquery UNION中属于不可缓存子查询的第二个或后面的SELECT

3.table

输出行引用的表的名称,也可以是以下值之一:

<unionM,N>:M和N的行的并集。

:值为N的行的派生表结果。例如,来自子句中的子查询。

:值为N的行的实例化子查询的结果。

4.partitions

查询将从中匹配记录的分区。该值用于未分区的表。

5.type

以下列表描述了联接类型,从最佳类型到最差类型排序:

typeValue 意义
system 该表只有一行(=系统表)。这是常量联接类型的特殊情况。
const 该表最多有一个匹配行,在查询开始时读取该行。因为只有一行,所以优化器的其他部分可以将该行中列的值视为常量。常量表非常快,因为它们只读取一次。
const用于将PRIMARY KEYUNIQUE索引的所有部分与常量值进行比较。在以下查询中,tbl_name可以用作常量表:
SELECT * FROM tbl_name WHERE primary_key=1;
SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;
eq_ref 对于上一个表中的每一行组合,将从该表中读取一行。除了系统类型和常量类型之外,这是最好的联接类型。当连接使用索引的所有部分,并且索引是PRIMARY KEYUNIQUE NOT NULL索引时,使用该方法。
eq_ref可用于使用=运算符进行比较的索引列。比较值可以是常量,也可以是使用在此表之前读取的表中的列的表达式。在以下示例中,MySQL可以使用eq_ref连接来处理ref_table
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
ref 对于上一个表中的每一行组合,将从该表中读取具有匹配索引值的所有行。如果联接仅使用键的最左边前缀,或者键不是PRIMARY keyUNIQUE索引(换句话说,如果联接无法根据键值选择单行),则使用ref。如果所使用的键仅与少数行匹配,则这是一种良好的联接类型。
ref可用于使用=或<=>运算符进行比较的索引列。在以下示例中,MySQL可以使用ref联接来处理ref_table
SELECT * FROM ref_table WHERE key_column=expr;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
fulltext 使用FULLTEXT索引执行联接。
ref_or_null 这种联接类型类似于ref,但MySQL会额外搜索包含NULL值的行。这种联接类型优化最常用于解析子查询。在以下示例中,MySQL可以使用ref_or_null连接来处理ref_table
SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;
index_merge 此联接类型表示使用了索引合并优化。在这种情况下,输出行中的键列包含使用的索引列表,而key_len包含使用索引的最长键部分列表。
unique_subquery 此类型替换以下形式的某些IN子查询的eq_ref
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery只是一个索引查找函数,它完全替换了子查询以提高效率。
index_subquery 此联接类型类似于unique_subquery。它替代了IN子查询,但它适用于以下形式的子查询中的非唯一索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)
range 仅检索给定范围内的行,使用索引选择行。输出行中的键列指示使用的索引。key_len包含所使用的最长密钥部分。此类型的ref列为NULL
当使用 =、<>、>、>=、<、<=、is NULL、<=>、BETWEEN、LIKE或IN()运算符 将键列与常量进行比较时,可以使用range
SELECT * FROM tbl_name WHERE key_column = 10;
SELECT * FROM tbl_name WHERE key_column BETWEEN 10 and 20;
SELECT * FROM tbl_name WHERE key_column IN (10,20,30);
SELECT * FROM tbl_name WHERE key_part1 = 10 AND key_part2 IN (10,20,30);
index 索引连接类型与ALL相同,只是扫描了索引树。这有两种方式:
·如果索引是查询的覆盖索引,并且可以用于满足表中所需的所有数据,则只扫描索引树。在本例中,Extra列显示Using index。仅索引扫描通常比ALL更快,因为索引的大小通常小于表数据。
·使用从索引中读取来执行全表扫描,以按索引顺序查找数据行。Uses index会显示在Extra列中。
当查询仅使用作为单个索引一部分的列时,MySQL可以使用此联接类型。
ALL 对前一个表中的每一行组合进行全表扫描。如果该表是第一个未标记为const的表,这通常是不好的,并且在所有其他情况下通常是非常糟糕的。通常,您可以通过添加索引来避免ALL,该索引允许基于以前表中的常量值或列值从表中检索行。

6.possible_keys

供选择的可能索引。

7.key

实际使用的键(索引)。

8.key_len

使用的索引长度。

9.ref

该列表示将哪些列或常量与索引进行比较,以从表中选择行。

10.rows

MySQL认为执行查询必须检查的行数。对于InnoDB表,该数字只是估计值,并不总是准确的。

11.filtered

由表条件筛选的行的估计百分比。最大值100,意味着没有对行进行筛选。值从100减少表示过滤量增加。

12.Extra

其他信息。更多Extra信息请参考MYSQL官方手册。

附:MYSQL官方手册-EXPLAIN

MySQL :: MySQL 8.0 Reference Manual :: 8.8.2 EXPLAIN Output Format

标签:column,explain,索引,详解,key,table,ref,SELECT
From: https://www.cnblogs.com/pingcode/p/17222105.html

相关文章

  • Mysql——事务隔离级别详解
        ......
  • MySQL三大日志——binlog、redo log和undo log详解
              ......
  • K8S配置文件详解
    apiVersion:v1#【必须】版本号kind:Pod#【必选】Podmetadata:#【必选-Object】元数据name:String#【必选】Pod的名称namespace:String#【必选】Po......
  • Python 中 with 语句的详解
    1.概述在Python中,只要一个对象实现了__enter__和__exit__方法,那么就能使用with语句,该对象也可以称之为上下文管理器。官方文档的相关说明:上下文管理器的语法:......
  • Maven POM.xml 标签详解
    pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其......
  • Java虚拟机详解——JVM常见问题总结
    面试必问关键词:JVM垃圾回收、类加载机制。 先把本文的目录画一个思维导图:一、Java引用的四种状态:强引用:用的最广。我们平时写代码时,new一个Object存放在堆内存......
  • 详解shell语法检查模式
    启用verbose调试模式在进入本指导的重点之前,让我们简要地探索下 verbose模式。它可以用-v调试选项来启用,它会告诉 shell 在读取时显示每行。要展示这个如何工作,下......
  • linux目录详解
      /bin存放二进制可执行文件/etc存放系统管理和配置文件/home存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/ho......
  • 后端基础——详解setup与hold
    一,基础 在数字集成电路中,通常用建立时间(setuptime)、保持时间(holdtime)、传输延迟时间(propagationdelaytime)、最高时钟频率(maximumclockfrequency)等几个参数具体描......
  • stm32F0中断系列详解
    1、中断的概念 概念:程序执行过程中CPU会遇到一些特殊情况,是正在执行的程序被“中断”,cpu中止原来正在执行的程序,转到处理异常情况或特殊事件的程序去执行,结束后再返......