实行计划(query Execution plan)
语法
explain select * from table
explain 中的列
expain出来的信息有10列,
分别是id,select_type,table、type,partitions,possible_keys,key,key_len,ref,rows,Extra,下面临这些字段涌现的能够举行诠释:
一、ID
SQL实行的递次的标识,SQL从大到小的实行
1、ID雷同时,实行递次由上至下
2、假如是子查询,ID的序号会递增,ID值越大优先级越高,越先被实行
3、ID假如雷同,能够认为是一组,从上往下递次实行;在一切组中,ID值越大,优先级越高,越先实行
二、select_type
示查询中每一个select子句的范例
1、SIMPLE:简朴的SELECT,不实用UNION或许子查询。
2、PRIMARY:最外层SELECT。
3、UNION:第二层,在SELECT以后运用了UNION。
4、DEPENDENT UNION:UNION语句中的第二个SELECT,依赖于外部子查询。
5、UNION RESULT:UNION的效果。
6、SUBQUERY:子查询中的第一个SELECT。
7、DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于表面的查询。
8、DERIVED:导出表的SELECT(FROM子句的子查询)
9、MATERIALIZED:物化子查询
10、UNCACHEABLE SUBQUERY:没法缓存效果的子查询,必需为外部查询的每一行从新盘算
11、UNCACHEABLE UNION:UNION 属于不可缓存的子查询的第二个或后一个挑选
三、table
输出行援用的表的称号。这也能够是以下值之一:
<unionM,N,...>:该行指的是id值为M和id值为N的并集。
<derivedN>:该行是指用于与该行的派生表效果id的值 N。比方,派生表能够来自FROM子句中的子查询
<subqueryN>:该行指的是id 值为的行的详细化子查询的效果N
四、type
示意MySQL在表中找到所需行的体式格局,又称“接见范例”。
经常运用的范例有: NULL, system, const, eq_ref, ref, range, index, ALL(从左到右,机能从差到好)
以下列表形貌了从最好范例到最差范例的衔接范例
NULL
MySQL在优化过程当中剖析语句,实行时以至不必接见表或索引,比方从一个索引列里拔取最小值能够经由过程零丁索引查找完成。
system
该表只要一行(如:体系表)。这是const衔接范例的惯例
const
该表最多只要一个婚配行,在查询开首读取。由于只要一行,所以优化器的其余部份能够将此行中列的值视为常量。 const表异常快,由于它们只读一次。
SELECT * FROM tbl_name WHERE primary_key=1; SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;
eq_ref
关于前面表格中的每一个行组合,从该表中读取一行。除了 system和 const范例以外,这是最好的衔接范例。当衔接运用索引的一切部份且索引是 索引PRIMARY KEY或UNIQUE NOT NULL索引时运用它。
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
示意上述表的衔接婚配前提,即哪些列或常量被用于查找索引列上的值
fulltext
运用FULLTEXT 索引实行衔接。
ref_or_null
SELECT * FROM ref_table WHERE key_column IS NULL;
index_merge
该指数兼并接见要领检索与多行 range扫描和他们的效果兼并到一个。此接见要领仅兼并来自单个表的索引扫描,而不扫描多个表。兼并能够生成其基本扫描的团结,交织或交织团结
SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20; SELECT * FROM tbl_name WHERE (key1 = 10 OR key2 = 20) AND non_key = 30; SELECT * FROM t1, t2 WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%') AND t2.key1 = t1.some_col; SELECT * FROM t1, t2 WHERE t1.key1 = 1 AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);
unique_subquery
此范例替代 以下情势的eq_ref某些 IN子查询:
value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery
此衔接范例类似于 unique_subquery。它替代IN子查询,但它实用于以下情势的子查询中的非唯一索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)
range
仅检索给定范围内的行,运用索引挑选行。的key 输出行中的列指导运用哪一个索引。将key_len包括已运用的时候最长的症结部份。该ref列 NULL实用于此范例。
range当一个键柱运用任何的比拟于恒定可运用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE,或 IN()运营商:
index
该index连接范例是一样的 ALL,只是索引树被扫描。这类状况有两种:
1、假如索引是查询的掩盖索引,而且可用于满足表中所需的一切数据,则仅扫描索引树。在这类状况下,Extra专栏说 Using index。仅索引扫描一般比ALL索引的大小一般小于表数据更快 。
2、运用索引中的读取实行全表扫描,以按索引递次查找数据行。 Uses index没有涌现在 Extra列中。当查询仅运用属于单个索引的列时,MySQL能够运用此衔接范例。
ALL
对前面表格中的每一个行组合举行全表扫描。假如表是第一个未标记的表 const,一般不好,而且在一切其他状况下一般 异常蹩脚。一般,您能够ALL经由过程增加基于常量值或初期表中的列值从表中启用行检索的索引来防止
五、possible_keys
该possible_keys列指导MySQL能够挑选在此表中查找行的索引,指出MySQL能运用哪一个索引在表中找到纪录,查询涉及到的字段上若存在索引,则该索引将被列出,但不肯定被查询运用
该列完整独立于EXPLAIN输出所示的表的序次。这意味着在possible_keys中的某些键现实上不能按生成的表序次运用。
假如该列是NULL,则没有相干的索引。在这类状况下,能够经由过程搜检WHERE子句看是不是它援用某些列或合适索引的列来进步你的查询机能。假如是如许,制造一个恰当的索引而且再次用EXPLAIN搜检查询
六、Key
key列显现MySQL现实决议运用的键(索引)
假如没有挑选索引,键是NULL。要想强迫MySQL运用或无视possible_keys列中的索引,在查询中运用FORCE INDEX、USE INDEX或许IGNORE INDEX。
七、key_len
示意索引中运用的字节数,可经由过程该列盘算查询中运用的索引的长度(key_len显现的值为索引字段的最大能够长度,并不是现实运用长度,即key_len是依据表定义盘算而得,不是经由过程表内检索出的)
不丧失精确性的状况下,长度越短越好
八、ref
示意上述表的衔接婚配前提,即哪些列或常量被用于查找索引列上的值
九、rows
示意MySQL依据表统计信息及索引选用状况,预算的找到所需的纪录所须要读取的行数
十、Extra
该Extra列 EXPLAIN输出包括MySQL处理查询的分外信息。以下列表说清楚明了此列中能够涌现的值。每一个项目还指导JSON花样的输出哪一个属性显现Extra值。关于个中一些,有一个特定的属性。其他显现为message 属性的文本
十一、partitions(扩大)
纪录将与查询婚配的分区。仅在运用PARTITIONS症结字时才显现此列 。非分区表显现null
本篇文章到这里就悉数完毕了,关于MySQL的更多学问人人能够关注ki4网的MySQL教程栏目!!!
以上就是MySQL中Explain的用法总结(细致)的细致内容,更多请关注ki4网别的相干文章!