explain是什么意思

2023-03-14 13:59 42次浏览 攻略

众所周知,MySQL的explain是SQL语句中使用的查询执行计划(QEP),使您能够清楚地了解MYSQL如何执行SQL语句,从而更好地优化SQL的语句和优化索引。

但是往往很多新人对explain输出的各字段含义不慎了解,下面我们就针对这些参数做一下详细的解释,希望能给到各位帮助。

explain参数详解

1)id 查询序列号,如果一条语句中包含多个SQL子句的话,此id代表SQL执行的先后顺序。

2)select_type 查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询

simple 它表示简单的select,没有union和子查询

primary 查询中最外层的SELECT(如两表做UNION或者存在子查询的外层的表操作为PRIMARY,内层的操作为UNION)

union 使用了union的联合语句

其他参数比较少用到,这些就不说明了。

3)table 查询的表

3)type 连接类型

system 表仅有一行,这是const类型的特列

const 表最多有一个匹配行,一般出现在查询使用了primary key 或者unique索引。

eq_ref 比较带索引的列,它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。

ref 使用了非唯一索引(操作符必须是“=”,值不可为NULL)做扫描

fulltext 全文索引

ref_or_null 类似ref,只是搜索条件包括:连接字段的值可以为null的情况,比如 where col = 2 or col is null

index_merge 使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。

unique_subquery 在子查询中,基于唯一索引进行扫描,类似于eq_ref

index_subquery 在子查询中,基于除唯一索引之外的索引进行扫描

range 范围扫描,基于索引做范围扫描,为诸如between,in,>=,like类操作提供支持

index 该联接类型与ALL相同,除了只有索引树被扫描。这通常比all快,因为索引文件通常比数据文件小。(也就是说虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)

all 全表扫描或者范围扫描:不使用索引,顺序扫描,直接读取表上的数据

备注:连接类型是一个非常重要的查询性能指标,从好到坏依次为:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

如果在生产环境中,特别是存储数据达上百万以上的表,至少得保证查询至少达到range级别,最好能达到ref。

3)possible_keys 提示使用哪个索引会在该表中找到行,只是一种可能的预估,不代表实际的查询执行计划。

4)keys MYSQL使用的索引,简单且重要

5)key_len MYSQL使用的索引长度

6)ref ref列显示使用哪个列或常数与key一起从表中选择行。

7)rows 显示MYSQL执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引

8)Extra 该列包含MySQL解决查询的详细信息。

distinct MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。

range checked for each record 没有找到合适的索引

using filesort MYSQL手册是这么解释的“MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。 然后关键字被排序,并按排序顺序检索行。

using index 只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的信息。这个比较容易理解,就是说明是否使用了索引

using temporary 为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。

相关推荐