Explain总结,SQL优化不再困难

type列
这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。
依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL 一般来说,得保证查询达到range级别,最好达到ref

NULL
mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。
例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表。
const, system
mysql能对查询的某部分进行优化并将其转化成一个常量(可以看show warnings 的结果)。
用于 primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。
system是const的特例,表里只有一条元组匹配时为system。
explain extended select * from (select * from film where id = 1) tmp;
eq_ref
primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。
这可能是在 const 之外最好的联接类型了,简单的 select 查询不会出现这种 type。
ref
相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
简单 select 查询,name是普通索引(非唯一索引)
range
范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。
index
扫描全表索引,这通常比ALL快一些。(index是从索引中读取的,而all是从硬盘中读取)
ALL
即全表扫描,意味着mysql需要从头到尾去查找所需要的行。通常情况下这需要增加索引来进行优化了

Extra列
这一列展示的是额外信息。常见的重要值如下:
Using index
查询的列被索引覆盖,并且where筛选条件是索引的前导列,是性能高的表现。
一般是使用了覆盖索引(索引包含了所有查询的字段)。对于innodb来说,如果是辅助索引性能会有不少提高
mysql> explain select film_id from film_actor where film_id = 1;
Using where
查询的列未被索引覆盖,where筛选条件非索引的前导列
mysql> explain select * from actor where name = 'a';
Using where Using index
查询的列被索引覆盖,并且where筛选条件是索引列之一但是不是索引的前导列,意味着无法直接通过索引查找来查询到符合条件的数据
mysql> explain select film_id from film_actor where actor_id = 1;
NULL
查询的列未被索引覆盖,并且where筛选条件是索引的前导列,意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地用到了索引,也不是完全没用到索引
Using index condition
与Using where类似,查询的列不完全被索引覆盖,where条件中是一个前导列的范围;
mysql> explain select * from film_actor where film_id > 1
Using temporary
mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。
Using filesort
mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。
此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。
这种情况下一般也是要考虑使用索引来优化的

posted @ 2024-02-28 09:39  恨铁不成钢2  阅读(14)  评论(0)    收藏  举报