explain执行计划

我们前面学的'执行频次'和'慢查询日志'和'profiles'是以执行时间来判定某条查询语句是否是慢查询语句,实际上这种判定是粗略的判定,并不能真正的 评判SQL语句的性能,我们需要使用explain查看SQL语句的执行计划,才能真正的评判SQL语句的性能

 

explain可以查看某条语句是否用到了索引、表的连接情况、表的连接顺序

 

explain或者desc命令获取MySQL如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序,语法如下

1、直接在select语句之前加上关键字explain / desc

 

我们需要准备之前的3张表,其中学生表和课程表是多对多的关系,另一张是中间表用于维护学生表和课程表之间的多对多关系

 

 

使用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字段里展示