版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一、explain查询的参数详解
1、id
准备数据
创建表和插入数据
create table course(
cid int(3),
cname varchar(20),
tid int(3)
);
create table teacher(
tid int(3),
tname varchar(20),
tcid int(3)
);
create table teacherCard(
tcid int(3),
tcodesc varchar(200)
);
insert into course values(1,'java',1);
insert into course values(2,'html',1);
insert into course values(3,'sql',2);
insert into course values(1,'web',3);
insert into teacher values(
1,'tz',1
),
(
2,'tw',2
),
(
3,'tl',3
);
insert into teacherCard values(
1,'tzdesc'
),
(
2,'twdesc'
),
(
3,'tldsc'
);
需求
做题步骤:
(1)、主干信息:查询老师信息
(2)、三表相连
(3)、补充查询条件
结论1:
id相同,从上往下顺序执行 优先执行数据条数少的表。
结论2:
id值不同,id值越大越优先查询(本质:在嵌套子查询时,先查内层 再查外层)
结论3:
2、select_type
左衍右连
3、type
system > const > eq_ref > ref > range > index > all 要对type进行优化的前提是有索引。
(1)、system(表里只有一行数据)
(2)、const(用主键当查询条件,即查询到的结果只有一条匹配的数据,称之为const级别)
总结:如果索引不是主键类型,将不会是const;一条数据,有索引并且索引类型是主键,将会是const。
(3)、eq_ref(给一个表加上主键,给另一个表的外键加上唯一约束,将唯一约束的每个字段当做查询条件和加上主键的那个表进行数据查询匹配,并且满足有且只有一条数据与它配对,并且每个唯一约束了的字段都能找到与之配对的那条数据,此时叫eq_ref级别)
(4)、ref(给该表的某个字段添加普通索引,利用普通索引字段当查询条件,去查该表字段,得到0条或多条数据就是ref级别)
(3)和(4)的区别总结:都是利用约束去查询;前者查询结果必须有且只有一条数据与添加了约束的字段对应;后者查询结果可以有一条或多条或没有数据与之对应。
(5)、range
(6)、index(只扫描所有列的所有数据)
(7)、all(查询全表的没一列数据)