explain执行计划
我们前面学的'执行频次'和'慢查询日志'和'profiles'是以执行时间来判定某条查询语句是否是慢查询语句,实际上这种判定是粗略的判定,并不能真正的 评判SQL语句的性能,我们需要使用explain查看SQL语句的执行计划,才能真正的评判SQL语句的性能
explain可以查看某条语句是否用到了索引、表的连接情况、表的连接顺序
explain或者desc命令获取MySQL如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序,语法如下
1、直接在select语句之前加上关键字explain / desc
explain select 字段列表 from 表名 where 条件;
我们需要准备之前的3张表,其中学生表和课程表是多对多的关系,另一张是中间表用于维护学生表和课程表之间的多对多关系
create table student(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '姓名',
no varchar(10) comment '学号'
) comment '学生表';
insert into student values (null,'黛绮丝','2022567890'),(null,'谢逊','2022567891'),(null,'殷天正','2022567892'),(null,'韦一笑','2022567893');
create table course(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '课程名称'
) comment '课程表';
insert into course values (null,'Java'),(null,'PHP'),(null,'MySQL'),(null,'Hadoop');
create table student_course( #学生表和课程表的中间表
id int auto_increment comment '主键' primary key,
studentid int not null comment '学生ID',
courseid int not null comment '课程ID',
constraint fk_courseid foreign key (courseid) references course (id),
constraint fk_studentid foreign key (studentid) references student (id)
) comment '学生课程中间表';
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,3,1),(null,4,4);
使用explain和desc的效果是一样的,比较常用的是explain,输出的是一个表格(里面记录了查询计划),其中列头及意思如下:
1、id(需要用到上面新加的3张表,用这3张表通过SQL语句的查询计划来演示id) select查询的序列号,表示查询中执行select字句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)
2、select_type:查询类型 表示select的类型,常见的取值有simple(简单表,即不使用表连接或者子查询)、primary(主查询,即外层的查询)、 union(union中的第二个或者后面的查询语句)、subquery(select | where之后包含了子查询)等
3、type:连接类型 表示连接类型,性能由好到差的连接类型为null(最好)、system、const、eq_ref、ref、range、index、all(最差)
4、possible_keys:可能用到的索引 显示可能应用在这张表上的索引,一个或多个
5、key:实际用到的索引 实际使用的索引,如果为null,则没有使用索引
6、key_len:索引的长度 表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好
7、rows:扫描的记录数 MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的
8、filtered:符合某条件的记录数百分比。根据主键或唯一索引查的时候,就是100%,根据常规索引查也可能出现100% 表示返回结果的行数占需读取行数的百分比,filtered的值越大越好,最高是100%。共查询了多少行÷共返回多少行×100%=filtered
9、Extra:额外的信息 在前面8个关键字的字段没展示的值,就会在Extra字段里展示