乐趣区

关于mysql索引:MySQL索引优化explain用法详细讲解

前言:这篇文章次要讲 explain 如何应用,还有 explain 各种参数概念,之后会讲优化

一、Explain 用法


模仿 Mysql 优化器是如何执行 SQL 查问语句的,从而晓得 Mysql 是如何解决你的 SQL 语句的。剖析你的查问语句或是表构造的性能瓶颈。

语法:Explain + SQL 语句;

如:Explain select * from user; 会生成如下 SQL 剖析后果,上面具体对每个字段进行详解

二、id


是一组数字,代表多个表之间的查问程序,或者蕴含子句查问语句中的程序,id 总共分为三种状况,顺次详解

  • id 雷同,执行程序由上至下
  • id 不同,如果是子查问,id 号会递增,id 值越大优先级越高,越先被执行
  • id 雷同和不同的状况同时存在

三、select_type


select_type 蕴含以下几种值

  • simple
  • primary
  • subquery
  • derived
  • union
  • union result

simple

简略的 select 查问,查问中不蕴含子查问或者 union 查问

primary

如果 SQL 语句中蕴含任何子查问,那么子查问的最外层会被标记为 primary

subquery

在 select 或者 where 里蕴含了子查问,那么子查问就会被标记为 subQquery,同三. 二同时呈现

derived

在 from 中蕴含的子查问,会被标记为衍生查问,会把查问后果放到一个长期表中

union / union result

如果有两个 select 查问语句,他们之间用 union 连起来查问,那么第二个 select 会被标记为 union,union 的后果被标记为 union result。它的 id 是为 null 的

四、table


示意这一行的数据是哪张表的数据

五、type


type 是代表 MySQL 应用了哪种索引类型,不同的索引类型的查问效率也是不一样的,type 大抵有以下品种

  • system
  • const
  • eq_ref
  • ref
  • range
  • index
  • all

system

表中只有一行记录,system 是 const 的特例,简直不会呈现这种状况,能够忽略不计

const

将主键索引或者惟一索引放到 where 条件中查问,MySQL 能够将查问条件转变成一个常量,只匹配一行数据,索引一次就找到数据了

eq_ref

在多表查问中,如 T1 和 T2,T1 中的一行记录,在 T2 中也只能找到惟一的一行,说白了就是 T1 和 T2 关联查问的条件都是主键索引或者惟一索引,这样能力保障 T1 每一行记录只对应 T2 的一行记录

举个不太失当的例子,EXPLAIN SELECT * from t1 , t2 where t1.id = t2.id

ref

不是主键索引,也不是惟一索引,就是一般的索引,可能会返回多个符合条件的行。

range

体现在对某个索引进行区间范畴检索,个别呈现在 where 条件中的 between、and、<、>、in 等范畴查找中。

index

将所有的索引树都遍历一遍,查找到符合条件的行。索引文件比数据文件还是要小很多,所以比不必索引全表扫描还是要快很多。

all

没用到索引,单纯的将表数据全副都遍历一遍,查找到符合条件的数据

六、possible_keys


此次查问中波及字段上若存在索引,则会被列出来,示意可能会用到的索引,但并不是实际上肯定会用到的索引

七、key


此次查问中实际上用到的索引

八、key_len


示意索引中应用的字节数,通过该属性能够晓得在查问中应用的索引长度,留神:这个长度是最大可能长度,并非理论应用长度,在不损失精确性的状况下,长度越短查问效率越高

九、ref


显示关联的字段。如果应用常数等值查问,则显示 const,如果是连贯查问,则会显示关联的字段。

  • tb_emp 表为非唯一性索引扫描,理论应用的索引列为 idx_name,因为 tb_emp.name=’rose’ 为一个常量,所以 ref=const。
  • tb_dept 为惟一索引扫描,从 sql 语句能够看出,理论应用了 PRIMARY 主键索引,ref=db01.tb_emp.deptid 示意关联了 db01 数据库中 tb_emp 表的 deptid 字段。

十、rows


依据表信息统计以及索引的应用状况,大抵估算说要找到所需记录须要读取的行数,rows 越小越好

十一、extra


不适宜在其余列显示进去,但在优化时非常重要的信息

using  fileSort(重点优化)

俗称 ” 文件排序 ”,在数据量大的时候简直是“死里逃生”,在 order by 或者在 group by 排序的过程中,order by 的字段不是索引字段,或者 select 查问字段存在不是索引字段,或者 select 查问字段都是索引字段,然而 order by 字段和 select 索引字段的程序不统一,都会导致 fileSort

using temporary(重点优化)

应用了长期表保留两头后果,常见于 order by 和 group by 中。

USING index(重点)

示意相应的 select 操作中应用了笼罩索引(Coveing Index), 防止拜访了表的数据行,效率不错!如果同时呈现 using where,表明索引被用来执行索引键值的查找;如果没有同时呈现 using where,外表索引用来读取数据而非执行查找动作。

Using wher

表明应用了 where 过滤

using join buffer

应用了连贯缓存

impossible where

where 子句的值总是 false,不能用来获取任何元组

select tables optimized away

在没有 GROUPBY 子句的状况下,基于索引优化 MIN/MAX 操作或者 对于 MyISAM 存储引擎优化 COUNT(*) 操作,不用等到执行阶段再进行计算,查问执行打算生成的阶段即实现优化。

distinct

优化 distinct,在找到第一匹配的元组后即进行找同样值的工作

创作不易,辛苦大家动动手指 点个赞吧

退出移动版