什么是聚集索引表?

时间:2018-03-14 21:04:40

标签: mysql sql-server database postgresql db2

我可能错了,但在互联网上似乎有不同意见。 SQL Server,MySQL,DB2和PostgreSQL显示了这些表的不同定义。

在阅读了来自不同供应商的数据(数据库手册,用户帖子等)之后,我能够区分出三种类型的感兴趣的表(对于这个问题,有许多,更多类型没有兴趣)。请耐心等待:

  1. 堆表

    • 所有行都存储在堆表中(可能是无序的)。
    • 每行都有一个标识它的内部ROWID。
    • 索引是可选的。如果添加,它们包括索引列作为索引键,加上ROWID(最终访问堆中的实际行)。
    • 注意:这个案子对这个问题没有兴趣,但是我在这里添加了它,以便对下面的第三个案例有所帮助。
  2. 纯索引表:< - 这是一个聚集索引表吗?

    • 有一个主索引,包括键列以及其中的非键列。所有数据都存储在索引中。
    • 数据遵循主索引顺序,因此按定义按主索引排序。
    • 不需要堆表来存储行。所有数据都已在索引中。没有任何ROWID,因为没有堆表。
    • SQL Server 表(通常)默认属于此类别。
    • MySQL InnoDB表似乎也属于这一类,因为它们似乎根本没有堆表。
  3. 索引+已排序的堆表:< - 这是一个聚簇索引表吗?

    • 有一个主要"聚集索引"。
    • 有一个堆表,其中的行按聚集索引定义的顺序存储。
    • 堆表中的每一行都有一个ROWID。
    • 聚簇索引不包含非键列,而是包含访问堆表中实行的ROWID。
    • DB2 似乎能够"集群"表。
    • PostgreSQL 似乎也将这些表称为"群集 ing 索引"表。
  4. 现在,这些#2或#3中的哪些是"聚集索引表"?谁说实话,谁说谎? :d

    换句话说,是术语"聚集索引表"每个供应商根据他/她喜欢自由定义的商业术语,或根据某些官方数据库理论是否有官方唯一定义?

1 个答案:

答案 0 :(得分:2)

据我所知,“聚簇索引”是索引的叶节点是数据页的索引。这与非聚集索引不同,其中叶节点是对存储在数据页上的行的引用。

一个表最多只能有一个聚簇索引。在具有聚簇索引的表中,数据按索引键排序。

Postgres不支持聚簇索引。它有一个名为"cluster"的表优化,它根据索引对数据进行排序。但是,不保留此顺序,因此它与聚簇索引不同。