Mysql-Explain(五):输出列-type

Mysql-Explain(五):输出列-type


简介
type    访问类型排序,显示查询使用了何种类型,从最好到最差依次是:system>const>eq_ref>ref>range>index>ALL    system    表只有一行记录,这是const类型的特例,这个平时很少出现
const    表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行记录匹配,所以这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
eq_ref    驱动表和关联表中的每行进行组合并且仅有一行记录。这是除了system 和 const 类型之外, 这是最好的联接类型。当连接使用索引的所有部分时, 索引是主键或唯一非 NULL 索引时, 将使用该值
ref    非唯一性索引扫描,返回符合某个索引值的所有记录,可能会有多条记录匹配
range    使用一个索引来检索给定范围的行,这种范围索引扫描比全表扫描效率要高
index    使用覆盖索引
all    全表扫描(full table scan)

演示

    system:表只有一行记录,这是const类型的特例

 

 上图所示第一条SQL语句查询结果只有一条记录,但是下面explain的结果显示type值却是all。
这里要理解清楚,const是表示mysql优化器在执行语句之前判断其结果肯定只有一条记录,因为id作为主键具有唯一性,id=常量肯定只有一条结果,因此mysql只有读取到第一条记录就可以停止查询直接返回结果。而第二个例子中,name字段既不是主键也不是唯一性索引,所以优化器无法判断其结果的数量(哪怕实际结果只是一条记录),所以要扫描所有记录。explain是sql语句执行前的优化和分析,不是执行后的统计!

驱动表和关联表中的每行进行组合并且仅有一行记录

 以表student为驱动表关联查询表school的时候,表student和表school是一对一关系,因为student.school_id对于的是school的主键(如果是唯一索引也可以),所以一个学生只能关联一所学校,所以表student的每一行记录都只能和关联表school组合成最多一条记录,所以第二行记录中type是eq_ref,表示驱动表每行记录只需要和关联表组合到第一行记录即可,你可以理解成student表的每一行记录在关联表school都是进行了一次type=const的查询。eq_ref是一种比较理想的查询方式,是我们在性能优化中比较原因看到的结果。

ref:非唯一性索引扫描,返回符合某个索引值的所有记录,可能会有多条记录匹配。

 

 

 

上图所示from列表子查询派生出的临时表<derived2>只有一行记录,因此外层临时表的select查询的type值就是system。其实这种情况在实际的应用中非常少见,上面例子的Sql语句也仅仅是为了演示这样写。

 


                        
参考链接:https://blog.csdn.net/u012180773/article/details/104318904
posted @ 2024-02-05 14:11  予真  阅读(30)  评论(0编辑  收藏  举报