(3) type: 索引类型、类型
system>const>eq_ref>ref>range>index>all
其中:system,const只是理想情况;实际能达到ref>range
system: 只有一条数据的系统表;或衍生表只有一条数据的主查询
const:仅仅能查到一条数据的SQL,用于Primary key或者unique索引
rq_ref:唯一性索引,对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多、不能0)
例如:select...from ...where name=.. 其中name必须为索引且唯一。
ref: 非唯一性索引,对于每个索引键的拆线,返回匹配的所有行(0,多)
range: 检索指定范围的行,where后面是一个范围查询(between, >, <...)
注意:in有时候会失效,从而转为无索引。
index:查询全部索引中数据
all:查询所有表中数据
(4)possible_keys:可能用到的索引,是一种预测,不准。
(5)key:实际使用到的索引
(6)key_len: 索引的长度;
作用:用于判断复合索引是否被完全使用(a,b,c)。
(7)ref: 注意与type中的ref值区分。
作用:指明当前表所参照的字段
(8)rows: 被索引优化查询的数据个数(通过索引查到的数据个数)
(9)Extra:
- using filesort: 性能消耗大;需要额外一次查询
例如:explain select * from test where a1='' order by a2; --using filesort
小结:1. 对于单索引,如果排序和查找是同一个字段,则不会出现using filesort;如果排序和查找不是同一个字端,则会出现。
避免:where哪些字段,就order by 那些字段
2. 对于复合索引,如果排序和查找的使用顺序是一致的(跨列部分索引失效,因此不算),则不会出现using filesort, 反之则会。 - 复合索引:不能跨列(最佳左前缀)
避免:where和order by按照复合索引的顺序使用,不要跨列或无序使用。 - using temporary:性能损耗大,用到了临时表,一般出现在group by语句中。
例如:explain select * from tests03 where a2 = 2 and a4=4 group by a3
避免:查询哪些列,就根据哪些列group by. - using index :性能提升;索引覆盖(覆盖索引)。只要查询的列全为索引,即可达成索引覆盖。
- using where :需要回表查询。
假设age为索引
例如:explain select age, name from test03 where age = a2; - impossible where: where子句永远为false.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通