知识卡片

聚簇索引与索引类型体系:为什么每张表最多一个聚簇索引

普通读书笔记卡

内容

索引关键字的顺序如果和表中数据的物理存储顺序一致,这个索引就是 聚簇索引;否则是非聚簇索引。这个定义直接决定了一个硬约束:一张表 的数据在磁盘上只能有一种物理排列顺序,因此每张表最多只能有一个 聚簇索引——不存在”表数据同时按学号又按姓名物理排列”这种可能, 其他关键字上的索引都只能是非聚簇索引(索引本身有序,但指向的数据 物理位置是分散的)。聚簇索引的价值在于范围查询和连接操作:数据 物理相邻意味着一次磁盘I/O能连续读到多条相关记录,甚至可以为两张 经常一起连接查询的表建立基于同一关键字的聚簇索引,让它们的相关 数据物理上落在同一磁盘块里,大幅加快连接速度;但代价是维护成本 极高——插入删除数据需要物理移动数据以维持顺序,一旦涉及多表聚簇, 挪动数据还可能连带破坏其他索引的一致性,因此创建聚簇索引(尤其是 跨表聚簇)需要非常谨慎。索引类型体系里还有另一条独立的分类线索: 主码索引(数据库自动为每张表的主码建立、天然是唯一性索引)、唯一性 索引(关键字值不允许重复,NULL除外,可以用CREATE UNIQUE INDEX 单独创建,不一定是主码)、普通索引(允许重复值,如出生日期这类天然 会有重复取值的字段)——主码索引一定是唯一性索引的一种,但唯一性 索引不一定是主码索引,这条”是否要求唯一”的分类线跟”是否聚簇”这条 分类线是相互独立、可以任意组合的两个维度。

参考来源

- 位置:《数据库原理(微课版)》第9章《数据库存储与索引》9.2.1节"索引 原理与类型"(源文件:_epub-src/index_split_006.html) - 结论依据:原文明确"如果表中数据按某个关键字的顺序排列,它就不可能 再按其他关键字的顺序排列了……每张表最多只有一个聚簇索引,其他索引 都是非聚簇索引……主码索引是唯一性索引,即每个值在表中仅出现一次 ……唯一性索引……主码索引是唯一性索引,但唯一性索引可以不是主码 索引",因此可以推出聚簇索引的唯一性约束及索引类型体系的两条独立 分类线。 - 原始内容:如果表中数据按某个关键字的顺序排列,它就不可能再按其他 关键字的顺序排列了……每张表最多只有一个聚簇索引,其他索引都是 非聚簇索引……主码索引是唯一性索引,但唯一性索引可以不是主码索引。