mysql - 什么是聚簇索引表?

标签 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 索引”表。

现在,#2 或#3 中哪些是“聚集索引表”?谁在说真话,谁在说谎? :D

换句话说,“聚簇索引表”这个词是各厂商随意定义的商业术语,还是根据某种官方数据库理论有一个官方唯一的定义?

最佳答案

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

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

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

关于mysql - 什么是聚簇索引表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49287609/

相关文章:

sql - T-SQL 动态枢轴

android - 如何根据在 ListView 中单击的特定项目向新 Intent 显示所有数据

mysql - 为单行关系创建关系表?

mysql - 无法更改列以接受 int 数据类型的空值

java - 如何忽略单元测试中的某些字段,Hibernate

java - Spring在 "Executing identity-insert immediately"时不回滚

PHP/MySQL - 显示名称/用户名/密码的安全字符,带有 PDO

sql - 使用其他表的条件更新表的最有效方法?

sql - 是否可以通过 bcp 将 'PRINT' 命令导出到文件中?

mysql - "Every derived table must have its own alias"Mysql错误