好的索引当然是要覆盖了!

如果你的查询中用到了索引,这是一个进步,如果能够更进一步,用到了覆盖索引,那么就更牛了!当我们设计一个索引的时候,如果能够从一个更加全面的角度去设计这个索引,不仅考虑到 where 中的条件,还能够考虑到整个 SQL,那么无疑这个索引的设计将是非常成功的。

当然不能为了覆盖而覆盖。

1. 什么是覆盖索引

要理解什么是覆盖索引,我们需要先来回顾一下 InnoDB 中索引树的数据结构。

假设我有如下数据:

id(主键)

username

age

address

gender

1

ab

99

深圳

2

bw

95

天津

3

cx

93

深圳

4

bc

80

上海

5

bg

85

重庆

6

ac

98

广州

7

bw

99

海口

8

ck

90

深圳

9

cc

92

武汉

10

af

88

北京

现在我给 username、age 以及 address 三个字段建立一个联合索引,那么这个联合索引的 B+Tree 可能是这个样子:

上面这个索引树是一个非聚集索引或者也可以说是一个二级索引,这种索引区别于我们之前文章跟大家聊的聚集索引(再聊 MySQL 聚簇索引),在聚集索引中,叶子结点就是这一行的数据,但是在二级索引中,叶子结点中保存的是主键值。

所以,当我们搜索的时候,如果使用的是二级索引,那么最终拿到的是主键值,有了主键值之后,我们还需要再去到聚簇索引中进行搜索,才能拿到完整的数据,这个过程我们也称之为回表。

很明显,如果进行了回表操作的话,那么执行效率显然就要下降一截,那么是否用到了二级索引就会回表呢?其实不然!如果是覆盖索引的话,就不需要回表。

那么什么是覆盖索引呢?

小伙伴们观察上面的索引树,大家发现在这个索引树中,离叶子结点最近的树枝上有 username、age 以及 address,而叶子结点上有 id,所以如果我想要查询的字段是 id、username、age 以及 address 中的任意一个或者任意几个的话,那么就不需要再去聚簇索引上查询了,当前这个 B+Tree 上直接就有现成的,直接返回即可,这个就是覆盖索引。

2. 实践

现在假设我有如下一张表:

CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `gender` varchar(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_prop_index` (`username`,`age`,`address`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

可以看到,这张表中有一个名为 user_prop_index 的索引,这个索引中一共存在三个字段,分别是 username、age 以及 address,现在我们来看如下 SQL 的执行计划:

explain select address from user where username='ab' and age=99\G

小伙伴们看到,Extra: Using index 就表示使用到了覆盖索引,因为我的查询 SQL 中最终想要的值,都在当前这棵索引树上。

更进一步,假设我要查询 id、address 以及 age 字段,如下:

explain select id,address,age from user where username='ab'\G

很明显,由于这三个字段都在索引树上,所以直接直接通过回表获取到。

但是,如果想直接 select *,那么由于这个索引树上没有 gender 字段,此时就必须要回表才能拿到 gender 字段的值,如下:

explain select * from user where username='ab'\G

可以看到,这个时候没有用到覆盖索引了。

3. 覆盖索引的优势

通过前面的介绍,覆盖索引的优势相信小伙伴们也能自己总结出来:

  1. 覆盖索引不需要回表,直接在 B+Tree 这颗索引树上就能读取到需要的数据,这极大的减少了数据库 IO 次数,在 IO 密集型应用中,这样的性能提升非常有效。
  2. 基于 B+Tree 中联合索引数据的排序规则,覆盖索引中,如果涉及到范围搜索,也是非常高效的(如果涉及到回表的话,效率就会降低很多)。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/291472.html<

(0)
运维的头像运维
上一篇2025-05-19 17:04
下一篇 2025-05-19 17:05

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注