繁体   English   中英

聚集索引的叶子节点存储什么

[英]What is stored in the leaf node of clustered index

我知道在聚集索引的叶节点中,表记录与主键一起存储。

但是我发现有些文章说主键是用真实记录的块地址而不是真实的表记录来存储的。

你能告诉我哪个是正确的吗?

(1)存储块地址在此处输入图像描述

(2)存储真实数据在此处输入图像描述

小心你读到的东西。 确保文章谈论“MySQL”及其主要“引擎”“InnoDB”。

主键存储的是真实记录的块地址,而不是真实的表记录。

数据的 B+Tree 的每个叶节点(块)中存储了几整行。 该 BTree 由PRIMARY KEY排序,它(显然)是行的一部分。

唯一的“块地址”是两个图中的链接。

我投票支持你的 2 号图表,附带以下条件:

  • 有一个 id=6 的 4 列行和 James, 37, LA 的其他列。
  • id=15 的行未完全显示。 也就是说,您遗漏了其他 3 列。

一个“块”为 16KB,可以容纳 1 到数百行,具体取决于

  • 行的大小,
  • 行是否已被删除,留下“空闲”空间,
  • 等等

(对于数据或索引,每个块 100 行是一个简单的经验法则。)

In the context of mysql and innodb, from the mysql official pagehttps://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html

每个 InnoDB 表都有一个特殊的索引,称为聚集索引,用于存储行数据。

如果表很大,与使用与索引记录不同的页面存储行数据的存储组织相比,聚集索引架构通常会节省磁盘 I/O 操作。

基于上述事实,尤其是第 2 点,我相信第 2 点是正确的。 在我看来,原因是(1)节省一次 I/O。 如果叶子节点保存了页地址,将有更多的 I/O 时间来获取记录。

(2)更多的可维护性。 如果发生分页,叶子节点只保存页地址,聚集索引更新记录数据页地址会很麻烦。

但是,我认为#1 有观点的原因是只保存地址比保存整行记录数据便宜,因此存储更多索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM