MySQL 和 PostgreSQL 之类的 RDB 是否为每个索引存储数据副本?或者只是带有指向真实对象的链接的 B 树?

Do RDBs like MySQL and PostgreSQL store copy of data for each index? Or just B-tree with links to real objects?

MySQL 和 PostgreSQL 等 RDB 如何管理新索引的内存?

我的猜测是 RDB 使用 References/Links 创建 B 树(或其他索引)到内存中的真实对象。 另一个猜测是它复制每个新索引的所有数据。

所以这个问题基本上是关于“B 树由什么组成?引用,还是真实对象?”

Google 关于数据库主题和 RDMS 产品的搜索太过火了。所以,我也将非常感谢关于这方面的好文章。

细节各不相同,但 B 树索引是存储在磁盘上的树结构。它包含索引项的副本(索引键)和指向table.

中索引行的(直接或间接)指针

B 树索引表示允许快速搜索的索引键的排序列表。树结构加快了搜索列表的速度,并允许插入和删除条目而不会造成太多数据流失。

不清楚您所说的“真实对象”是什么意思。索引键当然是真实的,它们存储在索引中。但是,如果您指的是整个 table 行,那只是从索引中引用的。

对于MySQL的Engine=InnoDB,它是这样工作的:

数据以PRIMARY KEY顺序存储在B+树中。这使得基于 PK 的查找和范围非常有效。

每个二级键也是一个B+树,但是按照二级键列给出的顺序排序。每个“行”也有 PK 的列,从而提供对数据 BTree 的引用(link)。

如果二级键的列加上主键是您唯一需要的列,则仅使用二级键的 BTree 执行查询。

没有某些其他数据库品牌中的“ROWNUM”。

如果您没有达到某些限制,您可以将所有 table 的列包含在二级索引中。