【Mysql语句优化---Explain使用以及相关属性含义】

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)代表了不同的性能特征。下面是您提到的访问类型的性能从高到低的排序:

  1. system: 这是最好的访问类型,但非常罕见。它发生在表只有一行数据,并且该表是MyISAM或MEMORY类型的表的子表时。

  2. const: 当查询优化器确定最多只能有一条匹配行时,使用这种类型。通常是主键或唯一索引的最左前缀与常量值进行比较。

  3. eq_ref: 这种类型通常用于主键或唯一索引的联接操作。它意味着MySQL将读取唯一索引或主键索引中的每一条记录,并且每次只读取一条。

  4. ref: 当使用非唯一索引进行访问时,或者当使用唯一索引但查询条件不是等值比较时,会出现这种类型。它意味着MySQL将读取索引中的所有匹配记录。

  5. range: 当查询使用索引进行范围扫描(范围查询)时,如WHERE子句中的IN()BETWEEN><等操作符,会出现这种类型。

  6. index: 这种类型意味着MySQL将扫描整个索引树。这可能比全表扫描快,因为索引通常比表小。
    扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。

  7. ALL: 这是最差的访问类型,意味着MySQL必须执行全表扫描。这是性能最低的访问方式,应该尽量避免。

为了优化MySQL查询,应该尽量减少ALL类型的使用,通过创建适当的索引来提高查询的type。例如,如果一个查询经常需要根据某个列进行过滤,那么为该列创建索引可能会将typeALL提升到range或更高。

优化查询时,还应该考虑查询的具体情况,比如数据分布、表的大小、索引的选择性等,以及是否可以通过重写查询、调整索引策略或修改表结构来提高性能。
联合索引—根据mysql索引树来判断,索引是否生效–相对好了解一些。
联合索引遵循最左原则
like KK%相当于=常量,%KK和%KK% 相当于范围

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值