为了更好地理解聚簇索引和非聚簇索引的概念,我们可以通过一个 图书馆的书架 的比喻来形象地说明它们的工作原理和特点。
1. 聚簇索引
1.1 比喻:按书名排序的书架
-
想象一个图书馆的书架,所有的书都按照书名的字母顺序(A~Z)排列。
-
书的位置就是它的索引位置,书名就是索引键。
1.2 查找过程
-
场景:坤爸让小坤买一本《唐诗三百首》。
-
过程:小坤目标明确,直接在书架上按照书名的字母顺序查找,很快找到了这本书。
1.3 特点
-
物理顺序:
-
书的物理位置就是它的索引位置。
-
例如,如果要找《哈利波特》,直接按照字母顺序到 "H" 开头的区域查找。
-
-
唯一性:
-
每本书的书名是唯一的,就像数据库中的主键一样。
-
-
只能有一个:
-
书架只能按照一种方式(比如书名)排列,不能同时按照书名和作者名排列。
-
-
插入新书:
-
如果有一本新书《坤说》,需要插入到 "K" 开头的区域,可能会导致书架上的书重新排列(数据页分裂)。
-
2. 非聚簇索引
2.1 比喻:书架旁边的分类标签
-
书架旁边有一些分类标签,按照主题、作者等信息分类。
-
书的物理位置仍然按照书名排列,但分类标签提供了另一种查找方式。
2.2 查找过程
-
场景:坤爸让大坤买一本儿童读物类的书。
-
过程:
-
大坤先在儿童读物的分类标签中找到《唐诗三百首》。
-
然后根据标签上的位置信息,去书架上找到这本书。
-
2.3 特点
-
逻辑顺序:
-
分类标签按照主题、作者等信息分类,但书的物理位置仍然按照书名排列。
-
例如,如果你想找作者是 "坤坤" 的书,先在分类标签中找到 "坤坤",然后根据标签上的位置信息去书架上找书。
-
-
多个索引:
-
图书馆可以有多个分类标签,比如按照作者、主题等分类。
-
-
插入新书:
-
如果有一本新书《Man》,只需要在分类标签中添加一条记录,书的物理位置不需要改变。
-
-
回表操作:
-
因为书架上的书是按照书名排列的,所以你需要先通过分类标签找到书名,再按照书名查找书的位置。这个过程称为 回表。
-
3. 聚簇索引 vs 非聚簇索引
特性 | 聚簇索引 | 非聚簇索引 |
---|---|---|
物理顺序 | 数据行的物理顺序与索引顺序一致 | 数据行的物理顺序与索引顺序无关 |
唯一性 | 索引键唯一(通常是主键) | 索引键可以重复 |
数量 | 每张表只能有一个聚簇索引 | 每张表可以有多个非聚簇索引 |
插入操作 | 可能导致数据页分裂 | 只需更新索引,不影响数据行的物理位置 |
查找过程 | 直接通过索引找到数据行 | 先通过索引找到主键,再通过主键查找数据行(回表) |
4. 总结
-
聚簇索引:数据行的物理顺序与索引顺序一致,查找效率高,但插入操作可能导致数据页分裂。
-
非聚簇索引:数据行的物理顺序与索引顺序无关,支持多个索引,但查找时需要回表操作。