explain执行计划-学习
2022-04-07 15:42:10 14 举报
mysql explain执行计划-学习
作者其他创作
大纲/内容
例子:
NULL
key 列:表示 MySQL 执行查询实际使用那些索引来查找,如果为 null,则证明没有使用索引。如果想强制使用或者忽略索引可以在查询语句加 force index(想要强制使用的索引名)或者 ignore index(想要忽略的索引名)PS:如果 possible_keys 有列,而 key 显示 null 的情况,可能是因为表数据不多,加索引作用也不大。
rows 列:这一列是 mysql 估计要读取并检测的行数,注意这个不是结果集里的行数。(只是个预测的数量)
ID:一组数字,表示 sql 语句中 select 的执行顺序,有几个 select 就有几个 id,按照 select 出现的顺序呈现结果。id 相同,执行顺序由上而下id 不同,序号会递增。值越大优先级越高,就越先执行
表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息
SIMPLE
Extra
rows
explain
为什么要用explain
key_len 列:在索引里使用的字节数,当 key 列的值为 NULL 时,则该列也是 NULLPS:索引的最大长度是 768 字节,字符串过长时,MySQL 会将前半部分提出来做索引,这点大家需要注意。(不过一般我们也不会在这么长的字段上建索引)
index
这一列是 mysql预估要读取的行数量
如果 possible_keys 有列,而 key 显示 null 的情况,可能是因为表数据不多,加索引作用也不大
select_type 列:select 查询的类型;类型种类:1.simple:简单查询。查询不包含子查询和 union,比如上面简介中演示的语句2.primary:跟上面相反,如果查询包含子查询和 union,就会被标记为 primary3.subquery:包含在 select 中的子查询(不在 from 子句中)4.derived:在 from 子句中子查询,MySQL 会将结果存放在一个临时表中,也称为派生表(derived 的英文含义)
key_len
在索引里使用的字节数,当 key 列的值为 NULL 时,则该列也是 NULL
ref 列:那些字段或者常量被用来和 key 列记录的索引配合查找值,常见的有:const(常量),func,NULL,字段名(例:film.id)
id
执行查询font color=\"#ff0000\
33
5.union:表示此查询是 UNION 中的第二个或随后的查询6.union result:从 union 临时表检索结果的 select
type 列:表关联类型或访问类型,重要的一列,是判断查询是否高效的一句:也就是 MySQL 决定如何查找表中的行就看这个列。结果有很多,性能从最优到最差为:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALLALL:全表扫描,性能极差。敲黑板哈,这种类型是不应该出现的,一定还可以加索引优化。index:全索引扫描,跟 ALL 差不多,不同的是 index 是扫描整棵索引树,比 ALL 要快些。range:font color=\"#ff0000\
哪些字段或者常量被用来和 key 列记录的索引配合查找值,常见的有:const(常量),func,NULL,字段名(例:film.id)
possible_keys 列:表示 MySQL 执行查询可能会使用那些索引来查找,如果为 null,可考虑在该列加个索引。
table
1
idx_name
表关联类型或访问类型,判断查询是否高效: MySQL 决定如何查找表中的行按性能最佳排序:1.null:在执行阶段用不着再访问表或索引2.const、system:该表至多有一个匹配行3.eq_ref:font color=\"#ff0000\
3
filtered 列,是一个百分比值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的 id 值比当前表 id 值小的表)
ref
explain案例
possible_keys
访问的表是哪一个
type
select_type
查询类型1.simple:简单查询。查询不包含子查询和 union2.primary:查询包含子查询和 union,就会被标记为 primary3.subquery:包含在 select 中的子查询(不在 from 子句中)4.derived:在 from 子句中子查询,涉及到临时表查询
font color=\"#ff0000\
filtered
执行查询可能会使用那些索引如果为 null,可考虑在该列加个索引。
两个扩展
7.dependent union:此查询是 UNION 中的第二个或随后的查询,其次取决于外面的查询8.uncacheable union:此查询是 UNION 中的第二个或随后的查询,同时意味着 select 中的某些特性阻止结果被缓存于一个 Item_cache 中9.dependent subquery:子查询中的 第一个 select,同时取决于外面的查询10.uncacheable subquery:子查询中的 第一个 select,同时意味着 select 中的某些特性阻止结果被缓存于一个 Item_cache 中
如果查询是基于分区表的话,会显示查询将访问的分区。
Using index
总结:关注的结果列也只有select_type、type 以及 extra 列
key
explain的10个结果列
partitions
Extra 列:额外信息Using index:使用覆盖索引,表示查询索引就可查到所需数据,不用回表,说明性能不错。Using where:在存储引擎检索行后再进行过滤,就是先读取整行数据,再按 where 条件进行取舍。Using temporary:mysql 需要创建一张临时表来处理查询,一般是因为查询语句中有排序、分组、和多表 join 的情况,一般是要进行优化的。Using filesort:对结果使用一个外部索引排序,而不是按索引次序从表里读取行,一般有出现该值,都建议优化去掉,因为这样的查询 CPU 资源消耗大。
film
0 条评论
回复 删除
下一页