8.8.2 EXPLAIN 输出格式

文章目录

  • EXPLAIN 输出列
  • EXPLAIN 连接类型
  • EXPLAIN 额外信息
  • EXPLAIN 输出解释

EXPLAIN 语句提供了有关 MySQL 如何执行语句的信息。EXPLAIN 适用于 SELECTDELETEINSERTREPLACEUPDATE 语句。

EXPLAINSELECT 语句中使用的每个表返回一行信息。它按照 MySQL 在处理语句时读取的顺序列出输出中的表。这意味着 MySQL 从第一个表中读取一行,然后在第二个表中找到一个匹配的行,然后再在第三个表中查找,依此类推。当所有表都被处理时,MySQL 输出所选的列,并在表列表中回溯,直到找到一个有更多匹配行的表。(译者注:读取完一个匹配的行组合后,按表列表顺序折返,直至找到一张存在更多匹配行的表)从该表中读取下一行,并继续处理下一个表。

注释
MySQL 工作台具有 可视化解释(Visual Explain) 功能,可提供 EXPLAIN 输出的可视化显示。请参阅 教程:使用解释来提高查询性能 。

EXPLAIN 输出列

本节介绍 EXPLAIN 生成的输出列。后面的部分提供了有关类型和 Extra 列的其他信息。

EXPLAIN 的每一个输出行都提供了有关一个表的信息。每一行都包含 表 8.1 “EXPLAIN 输出列” 中总结的值,并在下表中进行了更详细的描述。列名显示在表的第一列中;当使用 FORMAT=JSON 时,第二列提供输出中显示的等效属性名称。

JSON 名称 含义
id select_id SELECT 标识符
select_type None SELECT 类型
table table_name 输出行的表
partitions partitions 匹配的分区
type access_type 连接类型
possible_keys possible_keys 可选索引
key key 实际选择的索引
key_len key_length 所选键的长度
ref ref 索引比较的列
rows rows 要检查的行的评估
filtered filtered 被表条件所过滤的行的百分比
Extra None 额外信息

说明
值为 NULL的 JSON 属性不会显示在 JSON 格式的 EXPLAIN 输出中。

  • id(JSON 名称:select_id)
    SELECT 标识符。这是查询中SELECT的序列号。如果该行引用其他行的并集结果,则该值可以为NULL。在这种情况下,table列显示一个类似于的值,表示该行引用id值为 MN 的行的并集。

  • select_type(JSON 名称:无)
    SELECT的类型,可以是下表中显示的任何类型。JSON格式的EXPLAINSELECT类型公开为query_block的属性,除非它是SIMPLEPRIMARY。JSON 名称(如适用)也显示在表中。

    select_type JSON 名称 含义
    SIMPLE None 简单 SELECT (不使用 UNION 或子查询)
    PRIMARY None 最外层 SELECT
    UNION None UNION 中的第二个或下一个 SELECT 语句
    DEPENDENT UNION dependent (true) UNION 中的第二个或下一个 SELECT 语句,依赖外层查询
    UNION RESULT union_result UNION 的结果(集).
    SUBQUERY None 子查询中的第一个 SELECT
    DEPENDENT SUBQUERY dependent (true) 子查询中的第一个 SELECT,依赖于外层查询
    DERIVED None 派生表
    DEPENDENT DERIVED dependent (true) 依赖于另一张表的派生表
    MATERIALIZED materialized_from_subquery 物化子查询
    UNCACHEABLE SUBQUERY cacheable (false) 无法缓存结果并且必须重新评估外层查询中每一行的子查询
    UNCACHEABLE UNION cacheable (false) 在属于一个无法缓存的子查询的 UNION 中的第二个或下一个 SELECT (参考上面的 UNCACHEABLE SUBQUERY

    DEPENDENT 通常表示使用相关子查询,参阅 13.2.15.7 相关子查询 。

    当您使用 EXPLAIN 指定 FORMAT=JSON 时,输出没有直接等效于 select_type 的单个属性;query_ block 属性对应于给定的 SELECT。 与刚才显示的大多数 SELECT 子查询类型等效的属性是可用的(例如 MATERIALIZED 对应于materialized_from_subquery ), 并在适当的时候显示。SIMPLEPRIMARY 没有等效的 JSON。

    select 语句的 select_type 值显示受影响表的语句类型。例如,对于 DELETE 语句,select_typeDELETE

  • table(JSON 名称:table_name)
    输出行所引用(参照)的表的名称。这也可以是以下值之一:

    • :行是指 id 值为 MN 的行的并集。
    • :该行引用 id 值为 N 的行的派生表结果。例如,派生表可能来自 FROM 子句中的子查询。
    • :该行是指 id 值为 N 的行的物化子查询的结果。请参阅 8.2.2.2 使用物化优化子查询 。
  • partitions(JSON 名称:partitions)
    与查询匹配的记录所属的分区。对于未分区的表,该值为 NULL。参见 24.3.5 获取分区信息 。

  • type (JSON 名称:access_type)
    联接类型。有关不同类型的描述,请参阅EXPLAIN联接类型。

  • possible_keys(JSON 名称:possible_ keys)
    possible_keys 列表示 MySQL 可以选择从中查找该表中的行的索引。请注意,此列完全独立于 EXPLAIN 输出中显示的表的顺序。这意味着 possible_keys 中的一些键实际可能不会按生成的表顺序使用。
    如果此列为 NULL(或在 JSON 格式的输出中未定义),则不存在相关索引。在这种情况下,您可以通过检查 WHERE 子句来检查它是否引用了适合进行索引的一个或多个列,从而提高查询的性能。如果是,请创建一个适当的索引,并再次使用 EXPLAIN 检查查询。参见 13.1.9 ALTER TABLE 语句 。

    要查看表的索引,请使用 SHOW INDEX FROM tbl_name

  • key(JSON 名称:key)
    key 列表示 MySQL 实际决定使用的键(索引)。如果 MySQL 决定使用一个 possible_keys 索引来查找行,那么该索引将作为键值列出。

    key 可能会指定一个不存在于 possible_keys 值中的索引。如果所有 possible_keys 索引都不适合查找行,但查询选择的所有列都是其他索引的列,则可能会发生这种情况。也就是说,指定的索引覆盖(涵盖)了选定的列,因此尽管它不用于确定要检索哪些行,但索引扫描比数据行扫描更有效。

    对于 InnoDB ,即使查询也选择主键,二级索引也可能覆盖所选列,因为 InnoDB 将主键值与每个二级索引(项)一起存储。若 keyNULL,MySQL 就找不到可用于更有效地执行查询的索引。

    要强制 MySQL 使用或忽略 possible_keys 列中列出的索引,请在查询中使用 FORCE INDEXUSE INDEX,或 IGNORE INDEX。 参见 8.9.4 索引提示(hints) 。

    对于 MyISAM 表,运行 ANALYZE TABLE 可以帮助优化器选择更好的索引。对于 MyISAM 表,myisamchk --analyze 也执行同样的操作。参见 13.1.9 ALTER TABLE 语句 和 7.6 MyISAM 表维护和故障恢复 。

  • key_len(JSON 名称:key_length)
    key_len列表示 MySQL 决定使用的密钥的长度。key_len 的值使您能够确定 MySQL 实际使用多部分密钥的多少部分。如果 key 列表示 NULL ,那么 key_len列也表示 NULL

    由于键存储格式的原因,可以为NULL的列的键长度比NOT NULL列的(键长度)大一。

  • ref(JSON 名称:ref)
    ref 列显示将哪些列或常量与键列中指定的索引进行比较,以便从表中选择行。

    如果该值是 func,则使用的值是某个函数的结果。要查看哪个函数,请在 EXPLAIN后面使用 SHOW WARNINGS 来查看扩展的 EXPLAIN 输出。函数实际上可能是一个运算符,例如算术运算符。

  • rows(JSON名称:rows)
    rows 列表示 MySQL 认为执行查询必须检查的行数。

    对于 InnoDB 表,这个数字只是一个估计,可能并不总是准确的。

  • filtered (JSON 名称: filtered)
    filtered 列表示按表条件筛选的表行的估计百分比。(译者注:此处应反过来记,表示筛选后留下的行占表行总数的估计百分比。)最大值为 100, 这意味着没有对行进行筛选。从 100 开始递减的值表示过滤量的增加。rows 显示检查的估计行数,rows×filtered 显示与后一张表连接的行数。例如,如果行数为 1000, 过滤后的行数为 50.00(50%),则与后一张表连接的行数是 1000×50%=500

  • Extra (JSON name: none)
    本列包含有关 MySQL 如何解析查询的其他信息。有关不同值的描述,请参阅下文中的 EXPLAIN 额外信息。

    不存在对应于 Extra 列 的 JSON 属性;但是,此列中可能出现的值将作为 JSON 属性或 message 属性的文本公开。

EXPLAIN 连接类型

EXPLAIN 额外信息

EXPLAIN 输出解释

你可能感兴趣的:(《MySQL,8.0,参考手册》中文翻译,#,第,8,章,优化,数据库,mysql,java)