美图欣赏 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 数据库 > Mysql >

MySQL EXPLAIN 查询语句索引分析---优化器原理

2018-03-02 15:01|来源:未知 |作者:dnzg |点击:
1. EXPLAIN分析
 
锚点id
 
select查询的序列号.ID绝对不是执行顺序,执行顺序由SQL引擎来决定,这里的ID只是一个解 <>析顺序,单纯的理解SQL为由内向外执行是非常错误的.但大致上:id从小到大执行。ID如果相同,可以认为是一组,从上往下顺序执行
 
锚点select_type
 
select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。
                 ◇ DEPENDENT SUBQUERY:子查询中内层的第一个SELECT,依赖于外部查询的结果集;
                 ◇ DEPENDENT UNION:子查询中的UNION,且为UNION 中从第二个SELECT 开始的后面    所有SELECT,同样依赖于外部查询的结果集;
                 ◇ PRIMARY:子查询中的最外层查询,注意并不是主键查询;
                 ◇ SIMPLE:除子查询或者UNION 之外的其他查询;
                 ◇ SUBQUERY:子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集;
                 ◇ UNCACHEABLE SUBQUERY:结果集无法缓存的子查询;
                 ◇ UNION:UNION 语句中第二个SELECT 开始的后面所有SELECT,第一个SELECT 为PRIMARY
                 ◇ UNION RESULT:UNION 中的合并结果;
 
锚点table
 
输出的行所引用的表,看顺序,可以知道哪个表在UNION左边,哪个在右边
1
2
锚点type
 
type显示的是访问数据的方式,类型,是较为重要的一个指标  结果值从好到坏依次是:一般来说,得保证查询至少达到range级别,最好能达到ref。  system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL  表明SQL执行索引的方式,直接影响查询的快慢
 
◇ system:系统表,表中只有一行数据;
 
◇ const:读常量,且最多只会有一条记录匹配,由于是常量,所以实际上只需要读一次;  走的是primary key 或者unique索引,只会有一条匹配,所以速度排第二,如:  select * from erp_store where id=33607;
 
◇ eq_ref:最多只会有一条匹配结果,一般是通过主键或者唯一键索引来访问;  和const一样,走的是唯一索引,但是SQL是这样的  select * from erp_store store, erp_sku where store.id=sku.id  索引的查询值不是一个具体值,需要对比的情况
 
◇ ref:Join 语句中被驱动表索引引用查询;  走的索引不是唯一索引,但是匹配的也很少,假设receiverPhone做索引,但不是唯一索引,  select * from erp_so_header where receiverPhone=”15988860942;
 
◇ ref_or_null:与ref 的唯一区别就是在使用索引引用查询之外再增加一个空值的查询;  和ref一样,但是NULL值也是可以搜索的
 
◇ fulltext:走全文索引
 
◇ index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行merge 之后再读  取表数据;  or 或者 and 时,两个不同的索引,做的优化
 
◇ index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个  主键或者唯一索引;
 
◇ unique_subquery:子查询中的返回结果字段组合是主键或者唯一约束;
 
◇ rang:索引范围扫描;走索引的范围查询,匹配多行
 
◇ index:全索引扫描;比All好一点,因为走的索引不含全部数据列,所以好一点点
 
◇ all:全表扫描,走的聚簇索引,innodb中的id索引
 
锚点possible_keys
 
指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。
 
锚点key
 
显示MySQL实际决定使用的键。MySQL Query Optimizer 从possible_keys 中所选择使用的索引;
 
锚点key_len
 
显示MySQL决定使用的键的长度。长度越短越好,减少IO,网络宽带压力,如count(1)/count(*)优先选择二级索引最短的索引进行查询
 
锚点ref
 
查询时,过滤的时候,用的是常量(const),还是通过某个字段(一般在join中使用),下面是另外一种解释  列出是通过常量(const),还是某个表的某个字段(如果是join)来过滤(通过key)  的
 
锚点rows
 
这个数表示返回的结果集行数估计值,在innodb上是不准确的。
 
锚点filtered
 
表示查询过程中,遍历了多少行信息或者多少个索引列,或者列,才找到符合条件的行信息,只是一个估计值,innodb上是不准确的。
 
锚点Extra
 
查询中每一步实现的额外细节信息。更多的是一些优化器进行的优化策略提示 该列包含MySQL解决查询的详细信息,总结性描述查询行为,告诉我们怎么进行查询的
 
◇Only index:
 
这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快,不需要经过主键获取信息
 
◇where used:
 
就是使用上了where限制。表示从存储引擎返回行后(先索引,再主键),再根据条件语句过滤自己需要的行
 
◇ Distinct:
 
表示查找到了后停止了匹配。查找distinct 值,所以当mysql 找到了第一条匹配的结果后,将停止该值的查询而转为后面其他值的查询;
 
◇ Full scan on NULL key:
 
索引中含NULL值的优化:子查询中,如果碰到了要查一个索引,但是索引还包括NULL值时,优化器进行的一个优化方式。子查询中的一种优化方式,主要在遇到无法通过索引访问null  值的使用使用;
(责任编辑:dnzg)