explain进行sql语句性能分析

一、explain查询的参数详解

explain进行sql语句性能分析_第1张图片

1、id

准备数据

explain进行sql语句性能分析_第2张图片

创建表和插入数据

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)、主干信息:查询老师信息

explain进行sql语句性能分析_第3张图片

(2)、三表相连

explain进行sql语句性能分析_第4张图片

(3)、补充查询条件

explain进行sql语句性能分析_第5张图片

 

结论1:

id相同,从上往下顺序执行 优先执行数据条数少的表。

explain进行sql语句性能分析_第6张图片
explain进行sql语句性能分析_第7张图片

explain进行sql语句性能分析_第8张图片

结论2:

id值不同,id值越大越优先查询(本质:在嵌套子查询时,先查内层 再查外层)

 

explain进行sql语句性能分析_第9张图片

结论3:

explain进行sql语句性能分析_第10张图片

 

2、select_type

左衍右连

explain进行sql语句性能分析_第11张图片
a.
explain进行sql语句性能分析_第12张图片
b.
explain进行sql语句性能分析_第13张图片

 


3、type(优化级别)

system > const > eq_ref  > ref  > range > index > all  要对type进行优化的前提是有索引。

(1)、system(1、只有一条数据的系统表;2、衍生表只有一条数据的主查询)

explain进行sql语句性能分析_第14张图片

explain进行sql语句性能分析_第15张图片


(2)、const(用主键当查询条件即查询到的结果只有一条匹配的数据,称之为const级别)

create table test01(id int,name char(4));
insert into test01(1,'a');
alter table test01 add primary key(id);
explain select id from test01 where id = 1;

(3)、eq_ref(给一个表加上主键,给另一个表的外键加上唯一约束,将唯一约束的每个字段当做查询条件和加上主键的那个表进行数据查询匹配,并且满足有且只有一条数据与它配对,并且每个唯一约束了的字段都能找到与之配对的那条数据,此时叫eq_ref级别)

explain进行sql语句性能分析_第16张图片

explain进行sql语句性能分析_第17张图片


(4)、ref(给该表的某个字段添加普通索引,利用普通索引字段当查询条件,去查该表字段,得到0条或多条数据就是ref级别)

explain进行sql语句性能分析_第18张图片

explain进行sql语句性能分析_第19张图片

(3)和(4)的区别总结:都是利用约束去查询;前者查询结果必须有且只有一条数据与添加了约束的字段对应;后者查询结果可以有一条或多条或没有数据与之对应。


(5)、range(检索指定范围的行)

explain进行sql语句性能分析_第20张图片


(6)、index(只扫描索引列的所有数据)

explain进行sql语句性能分析_第21张图片
explain进行sql语句性能分析_第22张图片


(7)、all(查询全表的每一列数据)

explain进行sql语句性能分析_第23张图片
explain进行sql语句性能分析_第24张图片

 

4、possible_keys and key(预测用到的索引和实际用到的索引)

 

5、key_len(用于判断复合索引是否完全使用)

char:

explain进行sql语句性能分析_第25张图片

explain进行sql语句性能分析_第26张图片

varchar:

explain进行sql语句性能分析_第27张图片

6、ref

explain进行sql语句性能分析_第28张图片

7、rows(实际通过索引而查询到的数据个数)

explain进行sql语句性能分析_第29张图片

explain进行sql语句性能分析_第30张图片

 

8、Extra

优化方案:

  • where哪个索引列字段就oder by哪个索引列字段;
  • 复合索引时不要跨列无序使用;(where __ order by  __ 。__处要连续才不会报using filesort。)
  1. using filesort(排序)
  2. using temportary(使用了零时表查询,分组)
  3. using where(回表查询)
     
  4. using index(使用索引查询)
  5. impossible where(where条件不满足)

a1和a2是复合索

你可能感兴趣的:(MySql)