mysql中EXPLAIN使用简单说明
id相同,顺序从上到下
id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
type所显示的是查询使用了哪种类型
从最好到最差依次是
1 | system> const >eq_ref>ref>range>index>all |
达到ref级别是最好的
system 表只有一行记录(等于系统表),这是const类型的特列
const 表示通过索引一次就找到了,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快
eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它可能会找到多个符合条件的行
range 表示查询使用了索引范围查找,通常发生在查询条件中包含了范围条件
index 表示使用了覆盖索引,查询只需要扫描索引而不需要访问实际的数据行。这通常发生在只选择了覆盖索引中的列,而不需要访问实际数据的情况下
possible_keys
显示可能应用在这张表中的索引,一个或多个
key
实际使用的索引,如果为NULL,则没有使用索引。(可能原因包括没有建立索引或索引失效)
key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好
extra解释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Using index: 表示查询使用了覆盖索引,即查询只需要扫描索引而不需要访问实际的数据行。这是一种性能优化,因为不需要额外的 I/O 操作。 Using where: 表示查询中使用了 WHERE 子句,即有过滤条件。 Using filesort: 表示排序操作没有使用索引,而是通过对结果进行文件排序。这可能会影响性能,特别是对于大数据集。 Using temporary: 表示 MySQL 在执行查询时使用了临时表。这可能是由于一些复杂的查询或排序操作而导致的。 Using join buffer (Block Nested Loop): 表示 MySQL 在执行连接操作时使用了连接缓冲区,这是一种连接算法。 Impossible WHERE: 表示查询的 WHERE 子句中包含了不可能为真的条件,这可能导致优化器优化掉了整个查询。 Select tables optimized away: 表示优化器对查询进行了优化,直接返回了一个常量结果而不需要访问表。 Range checked for each record: 表示在 Range 访问类型中,MySQL 对每个记录进行了范围检查。 Using sort_union: 表示在执行联合查询时使用了排序操作 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通