mysql之-explain扯淡

explain 能分析你写的sql性能高不高,就这样概括下,不服来拍砖!!!

 

执行计划包含的信息


 

为什么说他能分析,因为他能干这种事情

1.表的读取顺序

2.数据读取操作的操作类型

3.哪些索引可能被使用 

4.哪些索引被实际使用

5.表之间的引用

6.每张表有多少行被优化器查询

 

id select查询的序列号,表示查询中执行select子句或操作表的顺序

id相同,执行顺序由上至下

id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

id相同不同,同时存在

 

select_type主要用于区别联合查询、子查询等的复杂查询,值有这些,下面分别介绍

SIMPLE 很简单的查询

PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为

SUBQUERY 在select或where列表中包含了子查询

DERIVED 在from列表中包含的子查询被标记为DERIVED(衍生)

                mysql会递归执行这些子查询,把结果放在临时表里

UNION 若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层                    select将被标记为DERIVED

UNION RESULT 从UNION表获取结果的select

 

table 显示这一行的数据是关于哪张表的

 

type是显示访问类型,较为重要的一个指标

显示查询使用了何种类型,从好到差依次是

system > const > eq_ref > ref > range > index > all

以上列出的只是常用的,知道这些就够了

保证查询达到range级别就够了,最好达到ref

说明:

 system:表只有一行记录(等于系统表) 这是const类型的特例,可以忽略不计

const:表示通过索引一次就找了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以             很快。如将主键置于where列表中,就能将该查询转换为一个常量

eq_ref:唯一性索引扫描,毒药每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描

ref:非唯一性索引扫描,返回匹配某个单独值的所有行,可能会找到多个符合条件的行,他属于查找和扫描         的混合体(例如查找哪些员工在研发部)

 range:只检索给定范围的行,场景说明:where语句中出现between、< 、>、in等的查询

              这种范围扫描索引扫描比全表扫描要好,开始于索引的某一点,结束另一点,不用扫描全部索引

index:Full Index Scan,index与all区别为index类型只遍历索引树,通常比all快,因为索引文件通常比数据               文件小。索然all和index都是读全表,但index是从索引中读取的,all是从硬盘中读的

all:Full Table Scan,遍历全表以找到匹配的行

 

possible_keys说明:

显示可能应用在这张表中的索引,一个或多个。但不一定被查询实际使用

 

key说明:

实际使用的索引,如果没有使用就是NULL

 

key_len说明:

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的

key_len的长度计算公式:
varchr(10)变长字段且允许NULL    =  10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段)
varchr(10)变长字段且不允许NULL =  10 *( character set:utf8=3,gbk=2,latin1=1)+2(变长字段)
char(10)固定字段且允许NULL        =  10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)
char(10)固定字段且不允许NULL        =  10 * ( character set:utf8=3,gbk=2,latin1=1)

如果还不明白可以借鉴此博客地址:http://www.cnblogs.com/gomysql/p/4004244.html

 

ref说明:

显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值

(列出的是通过常量const,或是某个表的某个字段来过滤的。)

rows说明:

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

Extra说明:查询中每一步实现的额外细节信息,主要可能会是以下内容:

 1). Distinct:查找distinct值,所以当mysql找到了第一条匹配的结果后,将停止该值的查询而转为后面其他值的查询; FullscanonNULLkey:子查

询中的一种优化方式,主要在遇到无法通过索引访问null值的使用使用;

2).  ImpossibleWHEREnoticedafterreadingconsttables:MySQLQueryOptimizer通过收集到的统计信息判断出不可能存在结果;

3). Notables:Query语句中使用FROMDUAL或者不包含任何FROM子句;

4). Notexists:在某些左连接中MySQLQueryOptimizer所通过改变原有Query的组成而使用的优化方法,可以部分减少数据访问次数;

5). Rangecheckedforeachrecord(indexmap:N):通过MySQL官方手册的描述,当MySQLQueryOptimizer没有发现好的可以使用的索引的时候,如果发现如果来自前面的表的列值已知,可能部分索引可以使用。对前面的表的每个行组合,MySQL检查是否可以使用range或index_merge访问方法来索取行。

 6). Selecttablesoptimized away:当我们使用某些聚合函数来访问存在索引的某个字段的时候,MySQLQueryOptimizer会通过索引而直接一次定位到所需的数据行完成整个查询。当然,前提是在Query中不能有GROUPBY操作。如使用MIN()或者MAX()的时候;

 7). Usingfilesort:当我们的Query中包含ORDERBY操作,而且无法利用索引完成排序操作的时候,MySQLQueryOptimizer不得不选择相应的排序算法来实现。

8).  Usingindex:所需要的数据只需要在Index即可全部获得而不需要再到表中取数据;

9). Usingindexforgroup-by:数据访问和Usingindex一样,所需数据只需要读取索引即可,而当Query中使用了GROUPBY或者DISTINCT子句的时候,

如果分组字段也在索引中,Extra中的信息就会是Usingindexforgroup-by;

10). Usingtemporary:当MySQL在某些操作中必须使用临时表的时候,在Extra信息中就会出现Usingtemporary。主要常见于GROUPBY和ORDERBY等操作中。

11). Usingwhere:如果我们不是读取表的所有数据,或者不是仅仅通过索引就可以获取所有需要的数据,则会出现Usingwhere信息;

12). Usingwherewithpushedcondition:这是一个仅仅在NDBCluster存储引擎中才会出现的信息,而且还需要通过打开ConditionPushdown优化功能才可能会被使用。控制参数为engine_condition_pushdown。

 

猜你喜欢

转载自zzgo20141028.iteye.com/blog/2364986