「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景( 二 )

select_typeSELECT_TYPE含义SIMPLE简单的select查询,查询中不包含子查询或者UNIONPRIMARY查询中若包含任何复杂的子查询,最外层查询标记为该标识SUBQUERY在SELECT 或 WHERE 列表中包含了子查询DERIVED在FROM 列表中包含的子查询,被标记为 DERIVED(衍生) MYSQL会递归执行这些子查询,把结果放在临时表中UNION若第二个SELECT出现在UNION之后,则标记为UNION ; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为 : DERIVEDUNION RESULT从UNION表获取结果的SELECTPRIMARY,SUBQUERY

「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景

文章插图
DERIVED(需要临时表,自然比上述效率低)
「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景

文章插图
typeTYPE含义NULLMySQL不访问任何表,索引,直接返回结果system表只有一行记录(等于系统表),这是const类型的特例,一般不会出现const表示通过索引一次就找到了,const 常用于primary key 或者 unique 索引(本质上都是唯一索引) 。因为只匹配一行数据,所以很快 。如将主键置于where列表中,MySQL 就能将该查询转换为一个常量 。const于将 "主键" 或 "唯一" 索引的所有部分与常量值进行比较eq_ref类似ref,区别在于使用的是唯一索引,使用主键的关联查询,关联查询出的记录只有一条 。常见于主键或唯一索引扫描ref非唯一性索引扫描,返回匹配某个单独值的所有行 。本质上也是一种索引访问,返回所有匹配某个单独值的所有行(多个)range只检索给定返回的行,使用一个索引来选择行 。where 之后出现 between , < , > , in 等操作 。indexindex 与 ALL的区别为 index 类型只是遍历了索引树, 通常比ALL 快, ALL 是遍历数据文件 。all将遍历全表以找到匹配的行结果值从最好到最坏以此是:
NULL > system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALLsystem > const > eq_ref > ref > range > index > ALL?
一般至少要达到range级别,最好达到ref。
const唯一索引,非关联查询
eq_ref,refeq_ref 跟 const 的区别是:两者都利用唯一索引,但前者是关联查询,后者只是普通查询?eq_ref 跟 ref 的区别:后者是非唯一索引
index,all都是读全表,区别在于index是遍历索引树读取,而ALL是从硬盘中读取 。
「MySQL高级篇」explain分析SQL,索引失效&amp;&amp;常见优化场景

文章插图
不走索引就会遍历全表
「MySQL高级篇」explain分析SQL,索引失效&amp;&amp;常见优化场景

文章插图
possible_keys,keypossible_keys : 显示可能应用在这张表的索引, 一个或多个 。?
key :实际使用的索引, 如果为NULL, 则没有使用索引 。(可能是没有走索引,需要分析)?
key_len : 表示索引中使用的字节数, 在不损失精确性的前提下, 长度越短越好。
  • 单列索引,那么需要将整个索引长度算进去;
  • 多列索引,不是所有列都能用到,需要计算查询中实际用到的列 。

「MySQL高级篇」explain分析SQL,索引失效&amp;&amp;常见优化场景

文章插图
ref显示索引的哪一列被使用了,如果可能的话,是一个常数 。
  • 当使用常量等值查询,显示const
  • 当关联查询时,会显示相应关联表的关联字段
  • 如果查询条件使用了表达式、函数,或者条件列发生内部隐式转换,可能显示为func
  • 其他情况为null
  1. id是索引,而且是id=1,一个常数,故ref = const
  2. user_id不是索引,ref直接为null

「MySQL高级篇」explain分析SQL,索引失效&amp;&amp;常见优化场景

经验总结扩展阅读