MySQL执行计划
程序员文章站
2022-06-01 22:19:29
...
查询执行计划:
explain +SQL语句
explain select * from tb ;
id | 编号 |
---|---|
select_type | 查询类型 |
table | 表 |
type | 类型 |
possible_keys | 预测用到的索引 |
key | 实际用到的索引 |
key_len | 索引长度 |
ref | 表之间的引用 |
rows | 通过索引查询到的数据量 |
Extra | 额外信息 |
规则
- id: id值相同,从上往下 顺序执行。
- 数据小的表 优先查询;
- id值不同:id值越大越优先查询(本质:在嵌套子查询时,先查内层 再查外层)
type:索引类型
system>const>eq_ref>ref>range>index>all
其中:system,const只是理想情况;实际能达到 ref>range
system
只有一条数据的系统表 ;或 衍生表只有一条数据的主查询
explain select * from (select * from test01 )t where tid =1 ;
test01表中只有一条数据
const
仅仅能查到一条数据的SQL ,用于Primary key 或unique索引
explain select tid from test01 where tid =1 ;
eq_ref
唯一性索引:对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多 、不能0)
select … from …where name = … .常见于唯一索引 和主键索引。
explain select t.tcid from teacher t,teacherCard tc where t.tcid = tc.tcid ;
以上SQL,用到的索引是 t.tcid,即teacher表中的tcid字段;
如果teacher表的数据个数 和 连接查询的数据个数一致(都是3条数据),则有可能满足eq_ref级别;否则无法满足。
ref
非唯一性索引,对于每个索引键的查询,返回匹配的所有行(0,多)
explain select * from teacher where tname = 'tz';
range
检索指定范围的行 ,where后面是一个范围查询(between ,> < >=, 特殊:in有时候会失效 ,从而转为 无索引all)
explain select t.* from teacher t where t.tid in (1,2) ;
explain select t.* from teacher t where t.tid <3 ;
index
查询全部索引中数据
explain select tid from teacher ;
tid 是索引, 只需要扫描索引表,不需要所有表中的所有数据
all
查询全部表中的数据
explain select cid from course ;
cid不是索引,需要全表所有,即需要所有表中的所有数据
总结:
system/const: 结果只有一条数据
eq_ref:结果多条;但是每条数据是唯一的 ;
ref:结果多条;但是每条数据是是0或多条 ;