开发者学堂课程【MySQL 高级应用 - 索引和锁:explain 之 extra 介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/598/detail/8606
explain 之 extra 介绍
一.释义
包含在其他列中显示但十分重要的额外信息【最重要的一段字段属性之一】。
额外信息:
1.using filesort:
说明 MySQL 会对数据使用一个外部的索引排序,而不是按照表内的索引完成的排序操作称为“文件排序”。
【出现某种情况用不上索引,用上 using filesort 比较危险】
Using filesort
mysq1> explain select co11 fron t1 uhere co11=' ac ' order by co13\ G
id :1
select _ type : SI
Н PLE
table :t1 type : ref
possible _ keys : idx _co11_co12_col3
key : idx _co11_co12_co13 key _ len :13
ref : const rous :142
Extra : Using uhere ; Using index ; Using filesort
1 row in set (0.00 sec )
ny5q1> expiain Seiect cO11FrOmt1 utere c011" ac Order by c012,C013\
id :1
select _ type : SIHPLE
table :t1 type : ref
mossible _ keys : idx _co11_co12_co13
key : idx _co11_co12_co13 key _ len :13
ref : const rouS :142
Extra : Using where ; Using index
row in set (0.00 sec )
2.using temporary:
使用了临时表保存中间结果,MySQL 在对查询结果排序时使用临时表。
常见于排序 order by 和分组查询 group by .
id :1
select _ type : SIHPLE
table :t1 type : range
possible _ keys : idx _co11_co12
key : idx _co11_co12 key _ len :13
ref : NULL
rowS :569
Extra : Using where ; Using index ; Using tenporary ; Using filesort
row in set (0.00 sec )
mysq1> explain select co11 fron t1 where co11 in (' ac ',' ab ') group by co11,co12\
id :1
select _ type : SIMPLE
table :t1 type : range
possible _ keys : idx _col1_co12_co13
key : idx _co11_co12_co13 key _ len :26
Г
ref : HULL rouS :
Extra : Using uhere ; Using index for group - by
3.using index:
【遇见这种情况不用管,前两者比较倒霉。】
表示相应的 select 操作中使用了覆盖索引( Covering Index ),避免访问了表的数据行,效率不错!如果同时出现 using where ,表明索引被用来执行索引键值的查找;
如果没有同时出现 using where ,表明索引用来读取数据而非执行查找动作。
4.using where:表示使用了 where 过滤
5.Using join buffer:使用了连接缓存
6.Impossible where:where 子句的值总是 FALSE,不能用来获取任何元组
7.Select tables optimized away :
在没有groupby子句的情况下,基于索引优化 min/max 操作或者对于 myisam 存储引擎优化【count*】操作,不必等到执行阶段在进行计算,查询执行计划生成的阶段即完成优化。
8. Distinct:优化 distinct 操作,在找到第一匹配的元组后即停止找同样值的动作。
MysQL> explaln select co12 fron t uhere col1-' ab *;
p055IDieeyIkeyI key _ len Iref Iros IEktra
( Cove : !11… idx _col1_co12 I idx _cel1_col2I13 Iconst I143IUsing uhere ; Using index
被用来执
1 row in set (0.0sec)
索引用来
如果同时出现 using where ,表明索引被用来执行索引键值的查找;
Пysq1> explaia select col1,ce12 fron t1;
1I select _ type I table I type Ipossib1e_ keys I key I key _1en I ref Iros IExtra
1ISIPLE It1Iindek I Н ULL I1dx_col1_co12I39 IHULL I682 IUsing indek
r0u n set (0.0sec
如果没有同时出现 using where ,表明索引用来读取数据而非执行查找动作。
覆盖索引( Covering Index ),一说为索引覆盖。
理解方式一:
就是 select 的数据列只用从索引中就能够取得,不必读取数据行, MysQL 可以利用索引返回 select 列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。
理解方式ニ:
索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。
一个索引包含了(或覆盖了)满足査询结果的数据就叫做覆索引
注意:
如果要使用覆盖索引,一定要注意 select 例表中只取出需要的列,不可 select ",因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。