通过explain命令获取mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序;explain分析后的结果解析:
1.select_type
查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询
1)SIMPLE:简单的select查询,查询中不包含子查询或者union
2)PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary
3)SUBQUERY:在select 或 where列表中包含了子查询
4)UNION:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived
2.type
访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是:
system > const > eq_ref > ref > range > index > ALL
一般来说,好的sql查询至少达到range级别,最好能达到ref;
1)system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,
可以忽略不计
2)const:表示通过索引一次就找到了,const用于比较primary key 或者 unique索引。
3)eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配(1对1);
4)ref:非唯一性索引扫描,返回匹配某个单独值的所有行。
5)range:索引范围扫描;
6)index:索引全扫描;
7)ALL:全表扫描
3.possible_keys
查询涉及到的字段上存在索引,则该索引将被列出,但不一定被查询实际使用
4.key
实际使用的索引,如果为NULL,则没有使用索引。
5.key_len
表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好;
6.ref
显示索引的哪些列
7.rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
8.Extra
不适合在其他字段中显示,但是十分重要的额外信息
优化目标 Tips:
1. 根据需求建立索引
2. 每个查询都要使用索引以提高查询效率,至少达到range级别,最好能达到ref;
3. 追求key_len和rows最小;