1、explain的12个字段 id:sql语句的编号 如果是连接查询表之间是平级关系就是id相同,从上向下查询 如果是子查询就id递增,id越大,优先级越高
select_type: 查询的类型 SIMPLE 简单的select查询,不包含字查询或UNION PRIMARY 含子查询或派生查询 SUBQUERY 非FROM子查询 SELECT * FROM test where id = (SELECT id FROM test where id = 9); 前面的select是PRIMARY,后面的是subquery DERIVED FROM型子查询,mysql会递归执行这些子查询,把结果放在临时表中 注意在mysql8.0后同一个表的数据会被优化成simple UNION 若第二个SELECT出现在UNION之后,被标记为UNION, 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED UNION RESULT 从UNION表获取结果的SELECT UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询) type 查询的方式非常重要,是分析”查数据过程”的重要依据可能的值 all:意味着全表扫瞄,可能扫到最后一行 index:扫瞄所有的索引节点,比all好 索引覆盖的查询情况下, 能利用上索引,但是又必须全索引扫描. index 是利用索引来进行排序,但取出所有的节点. all range: 意思是查询时,能根据索引做范围的扫描 index_merge 表示使用了索引合并的优化方法 ref_or_null 类似ref,但是可以搜索值为NULL的行 ref 意思是指通过索引列,可以直接引用到某些数据行 eq_ref 通过索引列,直接引用某1行数据 const, system, null 这3个分别指查询优化到常量级别, 甚至不需要查找时间. all < index < range < index_merge < ref_or_null < ref < eq_ref < const < system < null all < index < range < index_subquery < unique_subquery < index_merge < ref_or_null < fulltext < ref < eq_ref < const < system < null extra using index 用到了索引覆盖,表示效率非常高 using where 存储引擎检索行后再进行过滤。就是先读取整行数据,再按 where 条件进行检查 using temporary 用到了临时表 using filesort mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。 table 查询针对的表 真表名、b. 别名、c. derived(派生表)、d. null(直接计算结果),不走表 partitions 查询针对的分区 possible keys 可能用到的索引 key 实际用到的索引 key_len 使用索引的最大长度 ref 连接查询时表之间的字段关系 rows 是指估计要扫描多少行 filtered 按表条件过滤的行百分比