首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL 覆盖索引成立的条件说明

MySQL 覆盖索引成立的条件说明

原创
作者头像
用户11958489
发布2025-12-19 15:04:36
发布2025-12-19 15:04:36
1640
举报

在 MySQL 中,覆盖索引(Covering Index)指的是: 查询所需的数据可以完全从索引中获取,而无需回表读取数据行。

覆盖索引是否成立,取决于查询字段、索引结构以及执行计划。下面从原理和条件角度对覆盖索引的成立规则进行说明。


一、什么是覆盖索引

当一个查询满足以下条件时,即可称为覆盖索引:

查询所需要的所有列,都包含在同一个索引中。

示例表结构:

代码语言:javascript
复制
CREATE TABLE orders (
  id BIGINT PRIMARY KEY,
  user_id BIGINT,
  status TINYINT,
  amount DECIMAL(10,2),
  create_time DATETIME,
  INDEX idx_user_status (user_id, status)
);

二、覆盖索引成立的基本条件

条件一:查询字段全部包含在索引中

以下查询可以使用覆盖索引:

代码语言:javascript
复制
SELECT user_id, status
FROM orders
WHERE user_id = 1001
  AND status = 1;

原因是:

  • 查询字段:user_id, status
  • 索引字段:(user_id, status)
  • 不需要访问表数据行

条件二:查询中不包含未索引的列

以下查询 不满足 覆盖索引条件:

代码语言:javascript
复制
SELECT user_id, status, amount
FROM orders
WHERE user_id = 1001
  AND status = 1;

原因是:

  • amount 不在索引 idx_user_status
  • 必须回表获取 amount

三、SELECT * 会破坏覆盖索引

代码语言:javascript
复制
SELECT *
FROM orders
WHERE user_id = 1001
  AND status = 1;

即使查询条件命中了索引:

  • 查询结果需要所有列
  • 索引无法提供完整数据
  • 必然发生回表

因此,SELECT * 无法使用覆盖索引


四、主键在二级索引中的隐式存在

在 InnoDB 中,二级索引的叶子节点会包含主键值。

这意味着:

代码语言:javascript
复制
SELECT id
FROM orders
WHERE user_id = 1001
  AND status = 1;

该查询 仍然可能使用覆盖索引,因为:

  • id 是主键
  • 主键值已存储在二级索引中
  • 不需要额外回表

五、覆盖索引与 WHERE 条件的关系

覆盖索引不仅与 SELECT 列有关,也与 WHERE 条件有关。

以下查询可以使用覆盖索引:

代码语言:javascript
复制
SELECT user_id
FROM orders
WHERE user_id = 1001
  AND status = 1;

但以下查询无法使用:

代码语言:javascript
复制
SELECT user_id
FROM orders
WHERE status = 1;

原因是:

  • status 不是联合索引的最左列
  • 索引无法有效定位数据范围

六、通过 EXPLAIN 判断是否使用覆盖索引

EXPLAIN 结果中,覆盖索引通常会出现以下特征:

  • key 显示所使用的索引
  • Extra 字段包含 Using index

示例:

代码语言:javascript
复制
EXPLAIN
SELECT user_id, status
FROM orders
WHERE user_id = 1001
  AND status = 1;

Extra 中显示:

代码语言:javascript
复制
Using index

表示查询结果完全来自索引。


七、覆盖索引的本质原因

覆盖索引之所以能够避免回表,原因在于:

  • InnoDB 的索引本身是有序结构(B+Tree)
  • 索引叶子节点已包含查询所需数据
  • 无需通过主键再次定位数据行

这是一种结构层面的优化结果,而非额外的执行策略。


八、小结

覆盖索引是否成立,可以归纳为以下几点:

  • 查询字段必须全部包含在索引中
  • SELECT * 会直接破坏覆盖索引
  • InnoDB 二级索引天然包含主键
  • EXPLAIN 中的 Using index 是重要判断依据

覆盖索引不是“特殊索引类型”,而是查询与索引结构共同作用的结果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是覆盖索引
  • 二、覆盖索引成立的基本条件
    • 条件一:查询字段全部包含在索引中
    • 条件二:查询中不包含未索引的列
  • 三、SELECT * 会破坏覆盖索引
  • 四、主键在二级索引中的隐式存在
  • 五、覆盖索引与 WHERE 条件的关系
  • 六、通过 EXPLAIN 判断是否使用覆盖索引
  • 七、覆盖索引的本质原因
  • 八、小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档