一:在我们对sql语句进行性能分析时,发现mysql优化器我们没改,一些瓶颈问题没遇到,比如内存问题,IO问题也没出现。因此需要用explain来帮助我们分析
二:Explain是什么?
使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySql是如何处理你的SQL语句的,分析你的查询语句或者是表结构的性能瓶颈。
三:如何用Explain?
1:比如这条SQL语句:select *from tbl_cmp;
2:使用expalain如下:explain select *from tbl_cmp;
上面的输出结果的属性下面介绍。
所以格式就是:Explain+SQL语句
四:Explain能干什么(下面已经解释了)?
1:表的读取顺序 2:数据读取操作的操作类型 3:哪些索引可以使用
4:哪些索引被实际使用 5:表之间的引用 6:每场表有多少行被优化器查询
五:各字段解释:
1:id:
A:id相同时,执行顺序是由上至下的,比如:
B:id不同时:如果是子查询,id序列号会递增,id值越大优先级越高,越先被执行
C:id相同不同,同时存在
所以Explain可以进行表的读取顺序
2:select_type
A:SIMPLE:简单的select 查询,查询中不包含子查询或者UNION
B:PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为
C:SUBQUERY:在SELECT或WHERE列表中包含了子查询
D:DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MYSQL会递归执行这些子查询,把结果放在临时表里
E:UNION:若第二个SELECT出现在UNION之后,则被标记为UNION,若UNION包含在FROM子句的子查询中,外层SELECT将被标记为DERIVED
F:UNION RESULT:从UNION表获取结果的是SELECT
所以Explain可以查看数据读取操作的操作类型
3:type:访问类型排列
显示了查询使用了何种类型:从最好到最差依次是:system>const>eq_ref>range>index>ALL
4:possible_key
显示可能应用在这张表中的索引,一个或者多个
查询涉及到的字段上若存在索引,则改索引将被列出,但不一定被查询实际使用
5:key
实际使用的索引,如果为null,则没有使用索引
查询中使用了覆盖索引,则改索引仅出现在key列表中
注意看possible_keys中,比如第一行中理论上索引用可能用到了PRIMARY和idx_t1,而在key中实际上用到的要看key里面的
6:key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好
key_len显示的值为索引字段的最大可能长度,并非实际使用使用的长度,即key_len是根据表定义计算而得,不是通过表内检索出的。比如:
在这里可以看出第一个查询的key_len是13,第二个是26,长度不同是因为两个查询的精度不同,条件不同所以key_len不同。
7:ref:显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值
8:rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,比如:
9:extra:
包含不适合在其他列中显示但十分重要的额外信息