首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【SQL 数据库索引优化之 覆盖索引】原理深究剖析,拒绝假大空(VIP专属)

【SQL 数据库索引优化之 覆盖索引】原理深究剖析,拒绝假大空(VIP专属)

作者头像
flos chen
发布2026-01-23 18:47:03
发布2026-01-23 18:47:03
1040
举报

一个主键 id 和一个联合二级索引 professionagestatus。当执行查询时:

代码语言:javascript
复制
SELECT id, profession, age, status FROM tb_user WHERE profession = '软件工程' AND age = 31 AND status = '0';

数据库优化器会检查所有可用的索引,以确定是否有任何索引可以用于覆盖这个查询。在这个情况下,如果二级索引包含 professionagestatus,并且数据库的存储引擎(如InnoDB)在二级索引的叶子节点中也存储了主键 id,那么这个二级索引就可以作为覆盖索引。

为什么系统会自动识别到它们四个加起来是覆盖索引?

这是因为数据库的查询优化器在执行查询之前会进行索引扫描和访问路径的选择。如果发现有索引包含所有需要检索的列(在这个例子中是 idprofessionagestatus),那么优化器会选择使用这个索引来执行查询,而不需要进行回表查询。

这个覆盖索引是从哪里来的?

**覆盖索引并不是由用户显式声明的,而是由数据库系统根据已有的索引和数据存储方式自动识别的。**在InnoDB中,二级索引的叶子节点默认包含主键的值,所以如果二级索引的键值包括了 professionagestatus,并且 id 作为主键被存储在二级索引的叶子节点中,那么这个二级索引就可以作为覆盖索引使用。

为什么系统会提示使用了覆盖索引?

当执行 EXPLAIN 或其他类似命令来分析查询时,如果查询优化器决定使用覆盖索引,你会在分析结果中看到提示,如 Using index。这是系统告诉你它已经找到一个索引,它包含了查询所需的所有数据,因此不需要访问表的行数据。

总结来说,覆盖索引的使用是由数据库的查询优化器自动决定的,它基于已有的索引结构和数据存储方式。如果一个索引包含了查询所需的所有列,优化器就可能会使用这个索引来执行查询,从而提高性能。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结来说,覆盖索引的使用是由数据库的查询优化器自动决定的,它基于已有的索引结构和数据存储方式。如果一个索引包含了查询所需的所有列,优化器就可能会使用这个索引来执行查询,从而提高性能。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档