使用explain 分析sql 语句,能够显示mysql的执行计划,了解mysql是如何执行sql。为我们如何进行sql优化提供重要的参考信息
#学生表
create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
#课程表
create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
#教师表
create table Teacher(TId varchar(10),Tname varchar(10));
#成绩表
create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
使用方法
在需要执行的sql语句前加上explain,执行
各字段含义
id
mysql 会一条查询sql 语句中的每一个子查询提供一个id号
- id 号大的先执行
# 查询老师教的课程
explain select * from Teacher inner join Course on Course.TId = Teacher.TId
- id 号相同的从上往下执行
#查询课程 cid = 1 得分最高的学生信息
explain select Student.* from SC INNER JOIN Student On Student.SId=SC.SId where SC.CId=1 and SC.score = (select score from SC where Cid=1 order by score desc limit 1)
select_type
- SIMPLE 不包含子查询可关联查询
- prmary 包含子查询的最外层查询
- subquery查询子句位于where条件中
#查询课程 cid = 1 得分最高的学生ID号
explain select SId from SC where CId=1 and SC.score = (select score from SC where Cid=1 order by score desc limit 1)
- derived 派生查询,查询子句位于from中
- union ,union查询后面的查询语句
- union result,union查询合并生成的临时表
tabel
查询语句的数据来自那一张表
- 实际存在的一张表
- derivedN 通过ID为N的派生查询生成的临时表
- union(a,b) ID为a和b查询结果进行union操作后生成的表
partition
行数据来自那些分区
type
查询类型,mysql如何对表数据进行访问
- system 对只有一行数据的表进行查询
- count 使用主键/唯一键对表进行等值查询
- ref_ef 进行表自然链接查询,链接使用的字段 是 从表的主键/唯一键
- ref 使用普通键进行等值查询,返回多条数据
- range 范围扫描索引
- index 全扫描索引
- all 全表扫描
性能逐渐降低
possible_keys
列出查询可能使用到的索引
key
列出实际使用的索引,mysql基本上只能使用一个索引
key_len
使用的索引长度
这个数值不一定是实际的索引长度,对应一个组合索引,如果只有前几个字段有效,能组成最左列前缀,实际的索引长度是有效字段的总和。
ref
在where 筛选条件中,索引字段的数值类型(也就是等号右边的数值是什么),可以是一个常量或其他表字段
rows
存储引擎扫描的行数
filtered
查询结果的行数 与 存储引擎扫描的行数 比值,越接近1,性能越好。
Extra
额外的一些信息
- use index 使用到覆盖索引
- use filesore 使用到文件排序
- use temporary 使用到临时表
- use where 需要在mysl服务器层进行筛选