我可能是错的,但互联网上似乎对这些是什么有不同的看法。 SQL Server、MySQL、DB2 和 PostgreSQL 对这些表有不同的定义。
在阅读了来自不同供应商的大量资料(数据库手册、用户帖子等)后,我能够区分三种类型的感兴趣的表(对于这个问题还有很多很多类型不感兴趣)。请耐心等待:
堆表:
- 所有行都存储(可能是无序的)在堆表中。
- 每一行都有一个内部 ROWID 来标识它。
- 索引是可选的。如果添加,它们包括索引列作为索引键,加上 ROWID(最终访问堆中的实际行)。
- 注意:这个案例对本题没有兴趣,但我在这里添加它是为了与下面的第三个案例有所区别。
纯索引表:<-- 这是聚簇索引表吗?
- 有一个主索引,其中包括键列以及其中的非键列。所有数据都存储在索引中。
- 数据遵循主索引顺序,因此根据定义按主索引排序。
- 不需要堆表来存储行。所有数据都已在索引中。没有任何 ROWID,因为没有堆表。
- SQL Server 表(通常)默认属于此类别。
- MySQL InnoDB 表似乎也属于此类,因为它们似乎根本没有堆表。
索引 + 排序堆表:<-- 这是聚集索引表吗?
- 有一个主要的“聚集索引”。
- 有一个堆表,其中的行按照聚集索引定义的顺序存储。
- 堆表中的每一行都有一个ROWID。
- 聚簇索引不包括非键列,而是一个ROWID来访问堆表中的真实行。
- DB2 似乎能够“集群”表。
- PostgreSQL 似乎也将这些表称为“集群ing 索引”表。
现在,#2 或#3 中哪些是“聚集索引表”?谁在说真话,谁在说谎? :D
换句话说,“聚簇索引表”这个词是各厂商随意定义的商业术语,还是根据某种官方数据库理论有一个官方唯一的定义?
最佳答案
据我所知,“聚集索引”是一种索引,其中索引的叶节点是数据页。这与非聚集索引不同,后者的叶节点是对存储在数据页上的行的引用。
一个表最多可以有一个聚簇索引。在具有聚簇索引的表中,数据按索引键排序。
Postgres 不支持聚集索引。它确实有一个名为 "cluster" 的表优化根据索引对数据进行排序。但是,不会维护此顺序,因此它与聚集索引不同。
关于mysql - 什么是聚簇索引表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49287609/