索引和未索引执行计划的比较_执行计划EXPLAIN PLAN 解释,以及案例

EXPLAIN输出和 case示例

EXPLAIN 类型有 SELECT, DELETE, INSERT, REPLACE,和 UPDATE语句

EXPLAIN输出列解释:

ed008911c6b0b99afd4fbd221bde94e8.png

select_type 说明:

815238fb60d24150556c9e6240fe5c64.png

system
该表只有一行(=系统表)。这是const连接类型的特例 。const
该表最多只有一个匹配行,在查询开头读取。因为只有一行,所以优化器的其余部分可以将此行中列的值视为常量。 const表非常快,因为它们只读一次。eq_ref
对于前面表格中的每个行组合,从该表中读取一行。除了 system和 const类型之外,这是最好的连接类型。当连接使用索引的所有部分且索引是 索引PRIMARY KEY或UNIQUE NOT NULL索引时使用它。ref
对于前面表中的每个行组合,将从此表中读取具有匹配索引值的所有行。如果ref连接仅使用键的最左前缀,当 KEY不是a PRIMARY KEY或 UNIQUE索引(换句话说,如果连接不能基于键值选择单行),则使用此方法。如果使 用的KEY只匹配几行,这是一个很好的连接类型。fulltext
使用FULLTEXT 索引执行连接。ref_or_null
该联接类型如同ref,但除此之外,MySQL还会对包含NULL值的行进行额外搜索。此连接类型优化最常用于解析子查询。index_merge
此连接类型表示使用了索引合并优化。在这种情况下,key输出行中的列包含使用的索引列表,并包含所用索引key_len 的最长关键部分的列表。unique_subquery
unique_subquery 只是一个索引查找功能,它可以完全替换子查询以提高效率。index_subquery
此连接类型类似于 unique_subquery。它替换IN子查询,但它适用于子查询中的非唯一索引。 range
只检索给定范围内的行,使用索引选择行。输出行中的键列指示使用哪个索引。key_len包含所使用的最长的KEY部分。ref列对于这种类型为空。index
索引连接类型与ALL相同,只是扫描索引树。ALL
对表格中的每个行组合进行全表扫描。如果表是第一个未标记的表 const,这通常是不好的,并且在所有其他情况下通常 非常糟糕。通常,您可以ALL通过添加索引来避免,这些索引根据以前表中的常量值或列值从表中启用行检索。

Extra Information:

  • Child of 'table' pushed join@1

将该表引用为 table可以下推到NDB内核的联接中的子级。启用下推联接时,仅适用于NDB群集。

  • const row not found

对于诸如之类的查询,该表为空。 exp: SELECT ... FROM tbl_name

  • Deleting all rows

对于DELETE,某些存储引擎(如MyISAM)支持一种处理程序方法,该方法以一种简单而快速的方式删除所有表行。Extra如果引擎使用此优化,则显示此值。

  • Distinct

MySQL正在寻找不同的值,因此在找到第一个匹配的行后,它将停止为当前行组合搜索更多行。

  • FirstMatch(tbl_name)

半连接FirstMatch连接快捷方式策略用于tbl_name。

  • Full scan on NULL key

当优化器无法使用索引查找访问方法时,这会作为子查询优化的后备策略。

  • Impossible HAVING

该HAVING子句始终为false,不能选择任何行。

  • Impossible WHERE

该WHERE子句始终为false,不能选择任何行。

  • Impossible WHERE noticed after reading const tables

MySQL已读取所有 const(和 system)表,并注意该WHERE子句始终为false。

  • LooseScan(m..n)

使用半连接的LooseScan策略

  • No matching min/max row

没有行满足查询的条件,例如 。 SELECT MIN(...) FROM ... WHERE condition

  • no matching row in const table

对于具有联接的查询,存在一个空表或没有满足唯一索引条件的行的表。

  • No matching rows after partition pruning

对于DELETE或 UPDATE,优化器在分区修剪后找不到要删除或更新的内容。它的含义类似于Impossible WHERE for SELECT语句。

  • No tables used

查询没有FROM子句,或者有 FROM DUAL子句。

  • Not exists

MySQL能够对LEFT JOIN 查询进行优化,并且在找到符合LEFT JOIN条件的一行后,不检查该表中的更多行是否为上一行

  • Plan isn't ready yet

EXPLAIN FOR CONNECTION当优化器尚未完成为在命名连接中执行的语句创建执行计划时, 就会出现此值。如果执行计划输出包括多行,则Extra取决于优化程序确定完整执行计划的进度,其中任何一行或所有行都可以具有此 值

  • Range checked for each record (index map: N)

MySQL没有找到合适的索引来使用,但是发现一些索引可以在已知先前表中的列值之后使用。对于上表中的每个行组合,MySQL检查是否可以使用range或 index_merge访问方法来检索行。这不是很快,但是比完全没有索引的连接要快。

  • Recursive

这表明该行适用于SELECT递归公用表表达式的递归部分

  • Rematerialize

Rematerialize (X,...)在EXPLAINtable 的行中 显示T,其中X是任何侧向派生的表,当T读取新的时,该表的重新实现会被触发; exp: SELECT ... FROM t, LATERAL (derived table that refers to t) AS dt

  • Scanned N databases

这表示在处理INFORMATION_SCHEMA表查询时服务器执行了多少目录扫描

  • Select tables optimized away

优化器确定最多应返回一行,以及要生成该行,必须读取确定的一组行。当在优化阶段可以读取要读取的行时(例如,通过读取索引行),则在查询执行期间无需读取任何表。
当查询被隐式分组(包含聚合函数但没有GROUP BY子句)时,满足第一个条件 。当使用的每个索引执行一次行查找时,满足第二个条件。读取的索引数确定要读取的行数

  • Skip_open_table, Open_frm_only, Open_full_table

这些值指示适用于INFORMATION_SCHEMA 表查询的文件打开优化。
Skip_open_table:不需要打开表文件。该信息已经可以从数据字典中获得。

Open_frm_only:仅需要读取数据字典以获取表信息。

Open_full_table:未优化的信息查找。表信息必须从数据字典中读取并通过读取表文件来读取。

  • Start temporary,End temporary

这表明临时表用于半联接重复淘汰策略。

  • unique row not found

对于诸如这样的查询,没有行满足 索引或表中的条件

  • Using filesort

MySQL必须额外进行一遍,以找出如何按排序顺序检索行。排序是通过根据联接类型遍历所有行并存储与该WHERE子句匹配的所有行的排序键和指向该行的指针来完成的。然后对键进行排序,并按排序顺序检索行

  • Using index

仅使用索引树中的信息从表中检索列信息,而不必进行其他查找以读取实际行。当查询仅使用属于单个索引的列时,可以使用此策略。

  • Using index condition

通过访问索引元组并首先对其进行测试以确定是否读取完整的表行来读取表。这样,除非有必要,否则索引信息将用于延迟(“ 下推 ”)整个表行的读取

  • Using index for group-by

与Using index表访问方法类似,Using index for group-by 表示MySQL找到了一个索引,该索引可用于检索a GROUP BY或 DISTINCT查询的所有列,而无需对实际表进行任何额外的磁盘访问。此外,以最有效的方式使用索引,因此对于每个组,仅读取少数索引条目。

  • Using index for skip scan

表示使用跳过扫描访问方法。

  • Using join buffer (Block Nested Loop), Using join buffer (Batched Key Access)

来自较早联接的表被部分读取到联接缓冲区中,然后使用它们的行从缓冲区中执行与当前表的联接。 (Block Nested Loop)指示使用块嵌套循环算法,并(Batched Key Access)指示使用批量密钥访问算法。也就是说,EXPLAIN输出前行中的表中的键 将被缓冲,并且匹配行将从Using join buffer显示行所在的表中批量获取 。

  • Using MRR

使用多范围读取优化策略读取表。

  • Using sort_union(...),Using union(...),Using intersect(...)

这些指示了特定算法,该算法显示了如何针对index_merge联接类型合并索引扫描 。

  • Using temporar

为了解决该查询,MySQL需要创建一个临时表来保存结果。如果查询包含GROUP BY和 ORDER BY子句以不同的方式列出列,通常会发生这种情况。

  • Using where

WHERE子句用于限制匹配哪些行针对下一个表或发送到客户端。除非您专门打算从表中获取或检查所有行,否则如果查询中的Extra值不是 Using where且表联接类型为ALL或 ,则 查询中可能会出错index。

  • Using where with pushed condition

此备注只适用于NDB 表。这意味着NDB Cluster正在使用条件下推优化来提高在非索引列和常量之间进行直接比较的效率。在这种情况下,条件被“ 下推 ”到群集的数据节点,并同时在所有数据节点上进行评估

  • Zero limit

该查询具有LIMIT 0子句,无法选择任何行。

supplement explain case:

#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值