这里写自定义目录标题
explain关键字
关于explain的浅析
explain解析
1.id列:
select的序列号,有几个select就有几个id,并且id是按照select出现的顺序增长的,id列的值越大优先级越高,id相同则是按照执行计划列从上往下执行,id为空则是最后执行。
2.select_type列:
表示对应的是简单查询还是复杂查询
3.table列:
表示当前行访问的是哪张表
4.partitions列:
查询将匹配记录的分区。 对于非分区表,该值为 NULL。
5.type类型:
此列表示关联类型或访问类型。也就是MySQL决定如何查找表中的行。依次从最优到最差分别为:system > const > eq_ref > ref > range > index > all。
6.possible_keys:
此列显示在查询中可能用到的索引。
7.key列:
此列显示MySQL在查询时实际用到的索引。
8.key_len列:
此列显示MySQL在索引里使用的字节数,通过此列可以算出具体使用了索引中的那些列。
key_len计算
1.索引字段,**非NOT NULL**,加1个字节。
2.定长字段:tinyiny占1个字节、int占4个字节、bitint占8个字节、date占3个字节、datetime占5个字节,char(n)占n个字符。
3.变长字段:varchar(n)占n个字符+2个字节。
4.不同的字符集,一个字符占用的字节数不同:
各编码字符:
latin1编码,每个字符占用一个字节
gbk编码,每个字符占用两个字节
utf8编码,每个字符占用三个字节
utf8mb4编码,每个字符占用四个字节
9.ref列:
此列显示key列记录的索引中,表查找值时使用到的列或常量。常见的有const、字段名。
10.rows列:
此列是MySQL在查询中估计要读取的行数。注意这里不是结果集的行数。
11.Extra列:
1)Using index:使用覆盖索引(如果select后面查询的字段都可以从这个索引的树中获取,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值,这种情况一般可以说是用到了覆盖索引)。
2)Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖。
3)Using index condition:查询的列不完全被索引覆盖,where条件中是一个查询的范围。
4)Using temporary:MySQL需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的。
5)Using filed sort:将使用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。
6)Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段时。