1.explain查询分析,会展示如下几列

2.id

在查询中select的序列号,可为空,例:使用union(m,n),id为空

3.select type

查询类型,例如查询一张表查询条件里面有主键就是PRIMARY,FROM里面有子查询就是DERIVED,具体看下图,更复杂的查询想知道具体类型可以去官方搜下列select_type值

4.partitions 

表示是否用了分区表,为null,表示没用

可以用如下命令查询:SHOW CREATE TABLE 表名

例:下面这种就是用了分区表

 

5.type(优化必知)

1)system

表示表中只有一条数据,const的特殊例子

2)const

表示最多只有一条会被匹配,当查询使用主键或者唯一索引就是const,查询速度,因为只会读一次

3)eq_ref

当使用Join的时候,前一张表用主键或者非空唯一索引关联后一张表的时候,关联取后一张数据,这种就是eq_ref;还有一种就是前一张表的主键关联后一张表的列,外加后一张表的常数查询值,这样前一张表主键匹配到后一张表的数据也只会有唯一的一条,这种也是eq_ref.

例:

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;

4)ref

使用非唯一索引或者主键外的索引,匹配速度也比较快

5)fulltext

查询使用全文索引,例就是使用字符串索引,比不用索引速度快一点点

6)ref_of_null

就是索引列有null值,建议作为索引的值不要有null,null对mysql是一个特殊值,是未知,随机读取的,值数据结构比非null值多了一块标识这个值是null,占用存储空间更大,注:排序的时候按含有null值的列排序,多个null列mysql按null是无法排序

7)index_merge

使用索引进行多个范围的查询或者使用聚合索引的查询,再将多个查询结果合并,

例:

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;

SELECT * FROM innodb_table WHERE primary_key < 10 AND key_col1 = 20; SELECT * FROM tbl_name WHERE key1_part1 = 1 AND key1_part2 = 2 AND key2 = 2;

8)unique_subquery

子查询了用主键索引

例:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

 

9)range

对索引列进行范围检索,就是这些操作=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE, or IN()

SELECT * FROM tbl_name
  WHERE key_column = 10;

SELECT * FROM tbl_name
  WHERE key_column BETWEEN 10 and 20;

SELECT * FROM tbl_name
  WHERE key_column IN (10,20,30);

SELECT * FROM tbl_name
  WHERE key_part1 = 10 AND key_part2 IN (10,20,30);

10)index

与ALL一样,除非查询使用索引,因为索引比全表数据文件小,而且有序的

11)ALL

扫描全表数据,时间复杂度最高,尽量避免

5.EXTRA

是mysql如何做查询的额外补充,比较多,建议参看官方文档

参考官方文档:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-join-types

 

posted on 2020-06-07 20:43  柳无情  阅读(627)  评论(0编辑  收藏  举报