这是我参与11月更文挑战的第 13 天,活动详情查看:2021最后一次更文挑战
EXPLAIN的详细使用
在排查慢SQL时,我们经常使用explain来查看SQL执行计划。本次我们就来详细介绍下explain如何使用及其参数的分析。
1、id
select语句查询序列号。代表select语句的编号。如果是连接查询,那么表之间是平等关系,select都是1。如果有子查询,那么编号递增。
2、select_type
表示select语句的类型。有以下几种:
1、simple:简单查询,不包含子查询个连接查询。
2、primary:表示主查询,或者是最外面的查询语句(包含子查询或者派生查询)
3、union:连接查询的第 2 个或后面的查询语句
4、union result:连接查询的结果
5、subquery:子查询中的第 1 个 SELECT 语句。
6、dependent subquery:子查询中的第 1 个 SELECT 语句,取决于外面的查询。
3、table
表示查询的表,有可能是实际的表名,e.g. select * from t1;表的别名 如 select * from t2 as tmp;
4、type
表示表的连接类型。以下的连接类型的顺序是从最优到最差排序:
1、 system
表示仅有一行,这是 const 类型的特列,平时不会出现,也可以忽略不计。
2、 const
数据表最多只有一个匹配行,因为只匹配一行数据,所以很快,通常用于 PRIMARY KEY 或者 UNIQUE 索引的查询,
可理解为 const 是最优的。
3、 eq_ref
mysql 手册中这样介绍eq_ref:”对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除
了 const 类型。它用在一个索引的所有部分被联接使用并且索引是 UNIQUE 或 PRIMARY KEY”。eq_ref 可以用于使
用等于比较带索引的列。
4、 ref
查询条件索引既不是 UNIQUE 也不是 PRIMARY KEY 的情况。ref 可用于=或<或>操作符的带索引的列。
5、ref_or_null
如同 ref,但是添加了 MySQL 可以专门搜索包含 NULL 值的行。在解决子查询中经常使用该联接类型
的优化。
6、 index_merge
该联接类型表示使用了索引合并优化方法。在这种情况下,key 列包含了使用的索引的清单,key_len 包含了使
用的索引的最长的关键元素。
7、 unique_subquery
unique_subquery 是一个索引查找函数,效率更高。
8、 index_subquery
类似于 unique_subquery,可以替换 IN 子查询。
9、 range
只检索给定范围的行,使用一个索引来选择行
10、 index
该联接类型与 ALL 相同,除了只有索引树被扫描,通常比 ALL 快,因为索引文件通常比数据文件小。
11、 ALL
对于每个来自于先前的表的行组合,进行完整的表扫描。(性能最差,需要优化)
5、key
最终用的索引.显示 MySQL 实际决定使用的键(索引)。如果没有选择索引,键是 NULL。可以强制使用索引或者忽略索引。
6、ref
显示使用哪个列或常数与 key 一起从表中选择行。
7、rows
MySQL 执行查询时必须扫描的行数,越少说明索引命中率越高,SQL语句执行的越快。
8、Extra
包含 MySQL 解决查询的详细信息
Distinct: 发现第 1 个匹配行后,会停止为当前的行组合搜索更多的行。
Not exists: 能够对查询进行 LEFT JOIN 优化,发现 1 个匹配 LEFT JOIN 标准的行后,不再为前面的的行组
合在该表内检查更多的行。
Using filesort:需要额外的一次传递,以找出如何按排序顺序检索数据。
Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
Using temporary:表示需要创建一个临时表来容纳结果集。
Using where:WHERE 子句用于限制哪一个行匹配下一个表。
本文转载自: 掘金