一.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手动)类型转换),会导致索引失效而转向全表扫描
有以下几种情况