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;
子查询了用主键索引
例:
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