MySQL学习-非聚簇索引与联合索引

152 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

前言

上篇我们学习了MySQL中的InnoDB的索引之聚簇索引。有兴趣的小伙伴可以阅读(MySQL学习-聚簇索引)。
下面我们继续学习MySQL中的InnoDB的索引之非聚簇索引与联合索引。

索引按照物理实现方式,可以分为2种:聚簇索引和非聚簇索引。也把非聚簇索引称为二级索引或者辅助索引。

非聚簇索引

二级索引,是使用其他列值和主键值保存的数据。

回表: 根据其他列大小排序的B+树只能确定我们要查找记录的主键值,所以如果我们想根据其他列的值查找到完整的数据记录的话,仍然需要到聚簇索引中再查一遍,这个过程称为回表。也就是根据其他列的值查询一条完整的数据记录需要使用2个B+树。

为什么需要做一次回表操作呢?我们可以直接在叶子节点保存一份完整的数据记录,这样就可以和查聚簇索引一样,查一个B+树就可以了。这是因为,如果每一个索引都完整的存放数据记录,如果有100w条数据记录的话,每个都要完整记录,那有几个二级索引,就需要翻倍存储数据记录,加大了储存空间的开销。

联合索引

也可以把以多个列大小作为排序规则,也就是同时为多个列简历索引,比方说我们想用C2和C3两个列的大小进行排序,包含两层含义:

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

注意一点,以C2和C3列的大小为排序规则建立的B+树称为联合索引,本质上也是一个二级索引。它的意思是分别为C2和C3列分别建立索引的表述是不同的,不同点如下:

  • 建立联合索引只会建立如上图一样的1棵B+树。
  • 为C2和C3列分别建立索引会分别以C2和C3列的大小为排序规则建立2棵B+树。

InnoDB的B+树索引的注意事项

  1. 根页面位置万年不动
  2. 内节点目录项记录的唯一性
  3. 一个页面最少存储2条记录

今天先学习到这里,明天继续。