文章目录

  • 前言
  • 聚簇索引的概念
  • 聚簇索引又叫聚集索引
  • 并非所有的搜索引擎都支持聚簇索引
  • InnoDB 使用聚簇索引存储表数据
  • InnoDB 中的聚簇索引
  • InnoDB 表的一个示意图
  • InnoDB 的主键
  • InnoDB 表的主键索引就是聚簇索引
  • 使用聚簇索引的优点和缺点
  • 优点
  • 缺点
  • B-数、B+树和聚簇索引的联系
  • 引申文——了解更多的细节


前言

体能状态先于精神状态,习惯先于决心,聚焦先于喜好。

聚簇索引的概念

聚簇索引最大的区别在于其不光存储了索引先关信息,即一般索引指向表中的某一行,而聚簇索引直接将行中所有列数据存储在索引中。

聚簇索引又叫聚集索引

通过搜索资料发现,有很多人习惯于叫 聚簇索引为聚集索引。

并非所有的搜索引擎都支持聚簇索引

索引是由存储引擎负责实现的,不同的存储引擎对聚簇索引的支持不同,比如InnoDB是支持的。
并且不同的存储引擎的具体实现方式也会随着其数据结构的不同而有所不同,本文仅关注InnoDB中的聚簇索引。

InnoDB 使用聚簇索引存储表数据

InnoDB 中使用聚簇索引的方式是一个复合的过程,因为InnoDB 引擎使用 InnoDB 组织表的所有数据,即将表的所有数据存储在了聚簇索引的叶子节点中。
在具体实现上,此时的聚簇索引变成了B+Tree,且叶子节点用于存储行数据。

InnoDB 中的聚簇索引

在InnoDB中,聚簇索引的实现基于B+Tree ,其是 B+Tree 索引的一种变体,或者说其本质上依旧属于 B-Tree 结构。
B-Tree索引的基本模型是在每一个节点存储索引相关的信息,即搜索可能在非叶子节点结束,聚簇索引使用B+树,非叶子节点只存储索引,叶子节点保存所有列值
可以参考MySql中的B-TREE 和 B+TREE 需要强调的是,一个表中只能有一个聚簇索引.
mysql 分页基本空间为 16k

InnoDB 表的一个示意图

如下所示,我们有一张表,有三个字段,该表所有列的值将分别按排序存储在叶子节点中。

mysql 为什么要采用聚簇索引 mysql聚储索引_mysql 为什么要采用聚簇索引

InnoDB 的主键

由上面的概念和图示可知,InneDB 中的表存储是基于一个B+Tree 索引的,那么表中那一类会被作为索引列呢?
答案是主键。当你将一个列设置为主键时,其本身就是一个唯一索引了,如果表中没有定义主键,InnoDB会选择一个唯一的非空索引代替主键,如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。

InnoDB 表的主键索引就是聚簇索引

由于InnoDB 使用主键作为聚簇索引,所以其主键索引就是聚簇索引。强调这一点,是由于存在另一种主键索引,即主键索引只是普通的索引,其叶子节点不会存储行数据,而是存储指向行数据的地址。
此外,二级索引(也有些人叫辅助索引)的叶子节点的指向也会有所区别,对于InnoDB 二级索引也是B+树,非叶子节点仅存储索引信息,叶子节点存储主键,再由主键搜索具体的列值.。
请参考 InnoDB 表和MyISAM 表的主键索引和二级索引

使用聚簇索引的优点和缺点
优点
  • 可以把相关数据保存到一起,减少了I/O次数,否则可能需要多次需要索引——磁盘。
  • 数据访问更快。索引和数据保存在一起,更快了。
  • 使用覆盖索引扫描的查询可以直接使用页节点中的主键值。
缺点
  • 当数据全部放入内存时,聚簇索引在I/O性能方式的优势将荡然无存。
  • 插入速度依赖插入顺序。按照主键插入顺序加载数据到InnoDB表中是最快的。OPTIME TABLE 可以从新组织表。
  • 更新聚簇索引列的代价高。
  • 新加数据或主键变更可能导致“页”分类问题,一个页分类为两个页,占用更多空间。
  • 可能导致全表扫描变慢——当行比较稀疏,或由于页分裂导致数据存储不连续时。
  • InnoDB 二级索引可能比想象的要更大,因为二级索引的叶子节点包含了引用列的主键列。
B-数、B+树和聚簇索引的联系

B-树,B+树的区别,B-树结点也存数据信息,这里数据信息是具体数据的地址或者主键,B+只在叶子结点存这个具体数据。
聚簇索引是B+树的变体,但是叶子结点存储的不是地址也不是主键地址,而是所有的一行数据。

引申文——了解更多的细节

请移步 https://www.sohu.com/a/434529381_505827?sec=wd