美文网首页
性能调优-Explain详解与索引最佳实践

性能调优-Explain详解与索引最佳实践

作者: 桑翔 | 来源:发表于2020-12-09 21:11 被阅读0次

一.Explain工具介绍

        使用EXPLAIN关键字可以模拟优化器执行SQL语句.分析你的查询语句或是结构的性能瓶颈在select语句之前增加explain关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL

二.Explain中的列

1.id列

    id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。

    id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。

2.select_type

       1.)simple:简单查询.查询不包含子查询和union

       2.)primary:复杂查询最外层select

        3.)subquery:包含在select中的子查询(不在from子句中)

        4.)derived:包含在from子句中的子查询,MySQL会将结果存放在一个临时表中,也称为派生表

3. table列

        这一列宝石explain的一行正在访问哪个表

4.type列

        这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据的大概范围.

        依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL 

1.const,system:

const,system: mysql能对查询的某部分进行优化并将其转化为一个常量,const一般是根据主键条件去查找,所以查询出的行数据条数<=1,性能比较高,而system是const的一个特例,他只有一条数据,所以性能最高.

2.eq_ref

eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。这可能是在 const 之外最好的联接类型了,简单的 select 查询不会出现这种 type。

3.ref

ref:相比eq_ref,是使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值比较,可能会找到多个符合条件的行

4.range

range:范围扫描通常出现在in(),between,<,>,>=等操作中,使用一个索引来检索给定范围的行

5.index

index:扫描全索引表,这通常比ALL快一些

6.All

all:即全表扫描,意味着mysql需要从头到尾去查找所需的行,通常情况下这需要增加索引来优化了

三.索引最佳实践

        库表索引字段: name    age    position

        1.全值匹配

        2.最左前缀法则

                如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列,否则不会走索引

          3.  不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

    有以下几种情况

\color{red}{一.使用日期函数}

\color{red}{二.存储引擎不能使用索引中范围条件右边的列}


相关文章

网友评论

      本文标题:性能调优-Explain详解与索引最佳实践

      本文链接:https://www.haomeiwen.com/subject/bbkrwktx.html