SQL性能问题Explain-id
a.分析SQL的执行计划 : explain ,可以模拟SQL优化器执行SQL语句,从而让开发人员 知道自己编写的SQL状况
b.MySQL查询优化其会干扰我们的优化
优化方法,官网:https://dev.mysql.com/doc/refman/5.5/en/optimization.html
查询执行计划: explain +SQL语句 explain select * from tb ;
id : 编号
select_type :查询类型
table :表
type :类型
possible_keys :预测用到的索引
key :实际使用的索引
key_len :实际使用索引的长度
ref :表之间的引用
rows :通过索引查询到的数据量
Extra :额外的信息
准备数据:
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), tcdesc 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(4,'web',3);
insert into teacher values(1,'tz',1); insert into teacher values(2,'tw',2); insert into teacher values(3,'tl',3);
insert into teacherCard values(1,'tzdesc') ; insert into teacherCard values(2,'twdesc') ; insert into teacherCard values(3,'tldesc') ; |
查询课程编号为2 或 教师证编号为3 的老师信息
explain +sql:
(1)id: id值相同,从上往下 顺序执行。
t3-tc3-c4
tc3--c4-t6
表的执行顺序 因数量的个数改变而改变的原因: 笛卡儿积
a | b | c |
|
|
4 | 3 | 2 | 3*4*2 = 24 | 2*3*4 = 24 |
数据小的表 优先查询;
id值不同:id值越大越优先查询 (本质:在嵌套子查询时,先查内层 再查外层)
查询教授SQL课程的老师的描述(desc)
explain select tc.tcdesc from teacherCard tc,course c,teacher t where c.tid = t.tid and t.tcid = tc.tcid and c.cname = 'sql' ; |
将以上 多表查询 转为子查询形式:
explain select tc.tcdesc from teacherCard tc where tc.tcid = (select t.tcid from teacher t where t.tid = (select c.tid from course c where c.cname = 'sql') ); |
子查询+多表:
explain select t.tname ,tc.tcdesc from teacher t,teacherCard tc where t.tcid= tc.tcid and t.tid = (select c.tid from course c where cname = 'sql') ; |
id值有相同,又有不同: id值越大越优先;id值相同,从上往下 顺序执行