【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引

简介: 【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引
+关注继续查看

接上一篇内容。


一、聚簇索引


其实之前内容中介绍的 B+ 树就是聚簇索引。


这种索引不需要我们显示地使用 INDEX 语句去创建,InnoDB 引擎会自动创建。另外,在 InnoDB 引擎中,聚簇索引就是数据的存储方式。


它有 2 个特点:


特点 1


使用记录主键值的大小进行记录和页的排序


其中又包含了下面 3 个点:


  • 页(包括叶节点和内节点)内的记录按照主键的大小顺序排成一个单向链表。页内记录划分为若干组,每个组中主键值最大的记录在页内的偏移量被当做槽依次存放在页目录中。我们可以通过二分法快速定位主键值等于某个值的记录。
  • 各存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表。
  • 各存放目录项记录的页分为不同层级。在同一层级中的页,也是根据页中目录项记录的主键大小顺序排成一个双向链表。


特点 2


B+树的叶子节点存储的是完整的用户记录


这里完整的用户记录就是指,这个记录中存储了所有的列的值(包括隐藏列)。


二、二级索引


聚簇索引只能在我们搜索主键值时才能发挥作用,因为 B+ 树中的数据都是按照主键进行排序。


如果现在我用“别的列”作为搜索条件,怎么办?


答案:再建一个 B+ 树,用这个“别的列”(非主键列)的值大小作为排序规则。


比如之前的内容都是以 c1 列为主键,现在用 c2 列再来创建一个 B+ 树:


1268169-20210726134538538-709975698.png


看起来跟之前的聚簇索引没啥区别啊?实际上还是存在不同的:


  • 使用记录 c2 列的大小进行记录和页的排序。细分的 3 点与上面聚簇索引介绍的一样,只不过上面是主键,这里是用的 c2 列(非主键)。
  • B+ 树的叶子节点存储的不是完整的用户记录,只有c2 列 + 主键这2个列的值。
  • 目录项记录中不再是主键 + 页号,变成了c2 列 + 页号


另外需要注意的是,因为 c2 列不是主键,所以没有唯一性约束,可能存在多条满足搜索条件的数据


现在根据条件 c2 = 4 来查找数据记录,过程如下:


  • 确定第一条符合 c2 = 4 的目录项所在页,也就是页 42。
  • 到页 42 中,进一步确定第一条符合条件的记录所在的用户记录页。因为 2 < 4 <= 4,所以可能存在 页 34 或 35 中。
  • 先到页 34 中定位第一条满足 c2 = 4 的用户记录,如果有就不需要再到页 35 中继续定位了。
  • 在页 34 中定位到第一条记录。因为这条用户记录不完整,所以拿到这条记录的主键,再到聚簇索引中找到完整的用户记录。


上面最后一步,通过携带主键信息到聚簇索引中重新定位完整的用户记录的过程也叫回表


回表后,再回到这颗新的 B+ 树,找到刚才那个第一个符合条件的记录,并沿着记录的单向链表向后继续搜索其他也满足 c2 = 4 的记录,每找到一条就继续回表操作,重复这个过程。


这种以非主键列的大小为排序规则而建立 B+ 树需要执行回表操作才可以定位到完整的用户记录,这种 B+树就称为二级索引或者辅助索引


为什么要回表?直接把完整用户记录都放叶子节点不就可以了?


没错,思路没问题。但是这样操作就相当于每建立一颗 B+ 树都把所有的用户记录复制一遍,太浪费存储空间


三、联合索引


我们可以同时为多个列建立索引,比如 c2 列和 c3 列,以这 2 个列的大小为排序规则建立的 B+ 树索引就称为联合索引,也称为符合索引或多列索引。


这里的按照 c2 和 c3 列大小进行排序,需要注意两点


  • 先把各个记录和页按照 c2 列进行排序。
  • 在记录的 c2 列都相同的情况下,再采用 c3 列进行排序。


现在,给c2 和 c3 建立联合索引,如图所示:


1268169-20210726145232053-492426189.png


需要注意的是:


  • 每条目录项记录都是由 c2、c3、页号这 3 部分组成。各记录先按照 c2 列的值进行排序,如果记录的 c2 列相同,则按照 c3 列进行排序。
  • B+ 树叶子节点的用户记录由 c2、c3、和 主键c1 列组成。


本质上,联合索引也是一个二级索引,只不过它的索引列包括 c2、c3 这2个列。






相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 关系型数据库 MySQL
Mysql什么是聚簇索引什么是非聚簇索引 ?
在MySQL中,聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)是两种不同的索引类型。
73 0
|
4月前
|
存储 关系型数据库 MySQL
再聊 MySQL 聚簇索引
再聊 MySQL 聚簇索引
|
4月前
|
关系型数据库 MySQL 索引
MySQL二级索引的查询过程
聚簇索引就是innodb默认创建的基于主键的索引结构,而且表里的数据就是直接放在聚簇索引里,作为叶节点的数据页:
42 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL聚簇索引物理结构及主键查询过程
数据页分裂的过程,在你不停往表里灌入数据时,会搞出来一个个数据页,若你的主键非自增,他可能会有一个数据行挪动过程,保证你下一个数据页的主键值都大于上一个数据页的主键值。
42 0
|
4月前
|
关系型数据库 MySQL 索引
更新数据时,MySQL的聚簇索引是如何变化的?
文章已收录在我的 GitHub 仓库,欢迎Star/fork: Java-Interview-Tutorial 听说点赞、评论、收藏的人长得都很好看哦。
49 0
|
5月前
|
存储 关系型数据库 MySQL
MySQL InnoDB表和索引之聚簇索引与第二索引
MySQL InnoDB表和索引之聚簇索引与第二索引
39 0
|
6月前
|
SQL 存储 关系型数据库
PolarDB MySQL · 持续补强的全局二级索引
继我们去年年底发布内核原生的全局二级索引([用户文档](https://help.aliyun.com/document_detail/461220.html))以来,陆续有客户过来咨询和使用。目前已经有客户在生产实例上大规模使用全局二级索引(Global Secondary Index,下文用GSI代替),大大优化了分区表场景下不含分区键的Query/DML性能以及支持不含分区键的Unique
184 0
|
7月前
|
存储 关系型数据库 MySQL
【MySQL从入门到精通】【高级篇】(八)聚簇索引&非聚簇索引&联合索引
上一篇文章我们介绍了【MySQL从入门到精通】【高级篇】(七)设计一个索引&InnoDB中的索引方案,该文介绍了如何设计一个索引,以及InnoDB中的索引如何形成。
89 0
【MySQL从入门到精通】【高级篇】(八)聚簇索引&非聚簇索引&联合索引
|
8月前
|
存储 关系型数据库 MySQL
mysql聚簇索引和非聚簇索引
mysql聚簇索引和非聚簇索引
107 0
|
存储 SQL 关系型数据库
Mysql 二级索引回表知识点:顺序I/O & 随机I/O
Mysql 二级索引回表知识点:顺序I/O & 随机I/O
229 0
Mysql 二级索引回表知识点:顺序I/O & 随机I/O
推荐文章
更多