MySQL操作系列之SQL语句优化分析explain关键字(十)

(一)语法

 explain+SQL语句

 

(二)explain能做什么

①表的读取顺序;

②数据读取操作的操作类型;

③那些索引可以使用;

④那些索引被实际使用;

⑤表之间的引用;

⑥每张表有多少行被优化器查询;

 

(三)SQL语句分析后的结果分析(分析最重要的字段:id,type,key,rows,Extra):

①id:查询语句执行的流程。id的数值却大,就越先执行。如果id值相等,则由上至下的执行顺序。可以与table字段联合做参考。

②select_type:查询类型;
  SIMPLE:简单表,不使用表连接或子查询;
  PRIMARY:主查询,即外层的查询;
  UNION:UNION中的第二个或者后面的查询语句;
  SUBQUERY:子查询中的第一个;

③type:表示MySQL在表中找到所需行的方式,或者叫访问类型。常见访问类型如下,从上到下,性能由最好到最差:
  system与const:单表最多有一个匹配行;
  eq_ref:唯一索引扫描;类似ref,区别在于使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配;
  ref:非唯一索引扫描;使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行;
  range:索引范围扫描;常用于<、<=、>、>=、between等操作;
  index:索引全扫描;MySQL遍历整个索引来查询匹配行,并不会扫描表;
  ALL:全表扫描;(建议当数据到100万条级别以上,查询的级别有ALL,则这SQL语句需要优化)

④possible_keys: 表示查询可能使用的索引;

⑤key: 实际使用的索引;
(根据possible_keys与key分析:如果possible_keys有值,而key的值为NULL,也就是说理论上可能用到的索引,但是
实际上并没有用到索引,这说明索引可能失效了。如果possible_keys值为NULL,而key有值,出现的可能原因是查询的
字段与建立索引的循序与个数是刚好一致的,就直接从原先建立的索引中查找出来了,简称'覆盖索引')

⑥key_len: 显示索引字段最大可能的长度;长度越短越好。

⑦ref: 使用哪个列或常数与key一起从表中选择行。

⑧rows: 扫描行的数量;

⑨filtered: 存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例(百分比);

⑩Extra:扩展的:
  危险字段(指数:从上至下越来越大)需要优化:
  Using Flesort:表示MySQL需额外排序操作, 不能通过索引顺序达到排序效果;
  Using temporary:临时表的创建与回收,大大降低性能; 
  安全字段: 
  Using Index:表示索引覆盖,不会回表查询;
  Using Where:表示进行了回表查询
 (如果Using Index没有与Using Where一起出现,说明索引用来读取数据而非执行查询动作)

你可能感兴趣的:(关系型与非关系型数据库系列)