Explain使用以及相关属性含义
一.explain中的列
接下来我们将展示 explain 中每个列的信息。
1. id列
id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。
2. select_type列
select_type表示对应行是简单还是复杂的查询方式;
-
simple:简单查询。查询不包含子查询和union
explain select * from dept_emp de
-
primary: 复杂查询中最外层的select
-
subquery: 包含在select中的子查询例如 :select a,(select b from table) as t from table…
-
derived : 包含在from子句中的子查询。MySQL会将结果集存放在一个临时表中,例如:select a,b,c from (select * from table) t ;
用下面的例子来了解primary、subquery和derived类型
explain select e.emp_no,e.last_name,(select 1 from dept_emp where dept_no='d005') from (select * from employees) e
-
union: 在union中的第二个和随后的select
explain select * from employees e where e.gender ='M' union all select * from employees e2 where e2.gender='F'
3. table列
这一列表示 explain 的一行正在访问哪个表。 当 from 子句中有子查询时,table列是“deriven” 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查 询。
4.type列
这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。 依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL 一般来说,得保证查询达到range级别,最好达到ref
**NULL:**mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可以 单独查找索引来完成,不需要在执行时访问表
在MySQL中,type
列是EXPLAIN
命令输出的一部分,它显示了MySQL在查询过程中如何访问表。不同的访问类型(type
)代表了不同的性能特征。下面是您提到的访问类型的性能从高到低的排序:
-
system: 这是最好的访问类型,但非常罕见。它发生在表只有一行数据,并且该表是MyISAM或MEMORY类型的表的子表时。
-
const: 当查询优化器确定最多只能有一条匹配行时,使用这种类型。通常是主键或唯一索引的最左前缀与常量值进行比较。
-
eq_ref: 这种类型通常用于主键或唯一索引的联接操作。它意味着MySQL将读取唯一索引或主键索引中的每一条记录,并且每次只读取一条。
-
ref: 当使用非唯一索引进行访问时,或者当使用唯一索引但查询条件不是等值比较时,会出现这种类型。它意味着MySQL将读取索引中的所有匹配记录。
-
range: 当查询使用索引进行范围扫描(范围查询)时,如
WHERE
子句中的IN()
、BETWEEN
、>
、<
等操作符,会出现这种类型。 -
index: 这种类型意味着MySQL将扫描整个索引树。这可能比全表扫描快,因为索引通常比表小。
扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。 -
ALL: 这是最差的访问类型,意味着MySQL必须执行全表扫描。这是性能最低的访问方式,应该尽量避免。
为了优化MySQL查询,应该尽量减少ALL
类型的使用,通过创建适当的索引来提高查询的type
。例如,如果一个查询经常需要根据某个列进行过滤,那么为该列创建索引可能会将type
从ALL
提升到range
或更高。
优化查询时,还应该考虑查询的具体情况,比如数据分布、表的大小、索引的选择性等,以及是否可以通过重写查询、调整索引策略或修改表结构来提高性能。
联合索引—根据mysql索引树来判断,索引是否生效–相对好了解一些。
like KK%相当于=常量,%KK和%KK% 相当于范围