Explain 结果的几个主要字段解析:
id:select执行的顺序,id的值越select大执行的优先级越高,id为null的时候最后执行
select_type:查询类型,标识select查询的复杂度。简单查询:SIMPLE;复杂查询:SUBQURRY、PRIMARY、DERIVED
1.SIMPLE:不包含子查询、不包含UNION;
2.PRIMARY:最外层的查询;
3.SUBQUERY:包含于select中的子查询,但不在from子句中;
4.DERIVED:包含于from子句中的查询(改查询MySQL会将结果存放在临时表中,也称衍生表、派生表)。table:标识当前select查询所相关的表。
type:衡量SQL查询扫描行记录的大概范围。常见的结果集优先级为:system > const > eq_ref > ref > range > index > ALL。一般情况下SQL查询结果集保持到range级别即可,最好是ref。如果查询级别达到了ALL,则需要进行SQL优化。
1.system、const:相当于常量查询,表最多只有一条记录匹配。速度较快。system是const的特例,当表里只有一条元祖匹配是则type为system。
2.eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合 条件的记录。这可能是在 const 之外最好的联接类型了,简单的 select 查询不会出现这种 type。
3.ref::相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要 和某个值相比较,可能会找到多个符合条件的行。
4.range:范围查询(IN、BETWEEN、<、>等等),会使用一个索引来检索给定 范围的行。
5.index:全索引扫描。
6.ALL:全表扫描(通常需要优化)。possible_keys:可能用到的索引。
key:当前查询用到的索引
key_len:用到索引的长度,如果是联合索引,可以推断所用用到了联合索引中的哪几个字段。
key:这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常 量)、字段名称
row:当前select查询的检索的大概范围行数,大于等于结果行。(此数值并不代表结果集行数)
key_len长度计算:
- 数值类型:
1.tinyint:1字节;
2.smallint:2字节;
3.int:4字节
4.bigint:8字节 - 时间类型
1.date:3字节
2.timestamp:4字节
3.datetime:8字节 - 字符串
1.char(n):n字节长度
2.varchar(n):2字节存储字符串长度,如果是utf-8,则长度 3 * n + 2
注:索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半 部分的字符提取出来做索引。