0
点赞
收藏
分享

微信扫一扫

Mysql优化(5)explain

以沫的窝 2022-03-11 阅读 39

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 按表条件过滤的行百分比

举报

相关推荐

0 条评论