expain(desc)是mysql自带的优化器执行计划分析工具,它能模拟sql语句运行时,列举用到什么索引,建立临时表,排序,分组等操作的顺序和运行代价,从而分析这条语句有什么优化空间.

用法:

直接在sql语句前面加上就行
    一般的查询语句
    select * from emp where id = '205';
    前面加上explain就可以显示执行计划
    explain select * from emp where id = '205';
    或
    desc select * from emp where id = '205';

参数解析:
id:运行顺序标识符,SQL将从id值大的先执行,id相同时执行顺序由上至下,
select_type:表示查询的类型,有很多种类,这里列举一些常有的.
    SIMPLE:简单SELECT,不使用UNION或子查询等)
    PRIMARY:子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
    UNION:UNION中的第二个或后面的SELECT语句)
    DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询)
    UNION RESULT:UNION的结果,union语句中第二个select开始后面所有select)
    SUBQUERY:子查询中的第一个SELECT,结果不依赖于外部查询)
    DEPENDENT SUBQUERY:子查询中的第一个SELECT,依赖于外部查询)
    DERIVED:派生表的SELECT, FROM子句的子查询)
    UNCACHEABLE SUBQUERY:一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
table:输出结果集的表,有时不是真实的表名字,可能是简称,例如上面的e,d
partitions:匹配的分区,通常来说,很多表都不分区的.
type:表的执行访问类型,也代表这个操作的方式,直接影响sql语句的运行效率,最好到最差:NULL>system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL 
    NULL:直接查找到数据,不需要访问表和索引,除了直接查询语句外比较少见.
    system:表只有一行记录,这是const类型的特列,平时不大会出现,可以忽略.
    const:表示通过索引一次就找到了,const用于比较primary key或uique索引,因为只匹配一行数据,所以很快,如:主键置于where列表中,MySQL就能将该查询转换为一个常量
    eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描
    ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,返回所有匹配某个单独值的行,然而可能会找到多个符合条件的行,应该属于查找和扫描的混合体
    ref_or_null:类似ref,但是可以搜索值为NULL的行
    index_merge:表示使用了索引合并的优化方法
    range:只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现between、<>、in等的查询。
    index:索引扫描,Full index Scan,Index与All区别:index只遍历索引树,通常比All快,因为索引文件通常比数据文件小,也就是虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘读的。
    ALL:全表扫描,Full Table Scan,将遍历全表以找到匹配行,最差的运行方式,出现这个证明要加索引或者语句有问题.
possible_keys:表示查询时可能使用的索引,但也不一定被使用,如果没有任何索引显示 null
key:表示实际使用的索引,如果没有选择索引,键是NULL
key_len:使用到索引字段的长度,不一定是使用索引的完全长度,是系统自己计算的值,理论上是越短越好.
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值
rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需读取的行数,不一定准确.
filtered:按表条件过滤的行百分比,查询的表行占表的百分比
Extra:执行情况的描述和说明,表示这一组执行计划执行了什么类型的操作,有很多种类.
    Using filesort:说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,MySQL中无法利用索引完成的排序操作称为“文件排序”,如果存在排序并且取出的列包括text类型会使用到using filesort,这会非常慢.
    Using temporary:使用了临时表保存中间结果,MySQL在对结果排序时使用临时表,常见于排序order by 和分组查询group by
    Using index:表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错.如果同时出现using where,表明索引被用来执行索引键值的查找,如果没有同时出现using where,表明索引用来读取数据而非执行查找动作
    Using where:使用了where条件
    Using join buffer:使用了连接缓存
    impossible where:where子句的值总是false,不能用来获取任何元组
    distinct:一旦mysql找到了与行相联合匹配的行,就不再搜索了
    Select tables optimized away:SELECT操作已经优化到不能再优化了,MySQL根本没有遍历表或索引就返回数据了
    range checked for each record:没有找到合适的索引
    Using sort_union(...) , Using union(...) , Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描
    Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。
    No tables used:Query语句中使用from dual 或不含任何from子句