聚集索引和非聚集索引之间有什么区别?

Buy owner data from various industry. Like home owner, car owner, business owner etc type owner contact details
Post Reply
suhashini25
Posts: 76
Joined: Tue Dec 03, 2024 5:03 am

聚集索引和非聚集索引之间有什么区别?

Post by suhashini25 »

在 SQL 数据库中,聚集索引(Clustered Index)和非聚集索引(Non-clustered Index)是两种最基本的索引类型。它们最核心的区别在于数据行的物理存储方式以及索引叶子节点中存储的内容。

1. 聚集索引(Clustered Index)
定义: 聚集索引决定了表中数据行的物理存储顺序。也就是说,表中的数据行实际上是按照聚集索引键的顺序进行物理排序和存储的。
特性:
唯一性: 一个表只能有一个聚集索引。因为数据行只能以一种物理顺序存储在磁盘上。
数据包含在叶子节点: 聚集索引的叶子节点就是数据行本身。这意味着当你通过聚集索引查找数据时,一旦找到索引的叶子节点,你就直接找到了实际的数据。
主键默认: 在许多数据库系统(如 SQL Server, MySQL InnoDB)中,如果你为表定义了主键,那么数据库会默认在主键列上创建聚簇索引(如果该表还没有聚簇索引的话)。
范围查询优势: 由于数据是物理上排序的,对聚集索引列进行范围查询(如 WHERE ID BETWEEN 100 AND 200)效率非常高,因为相关数据在磁盘上是连续存储的,减少了磁盘寻道时间。
插入/更新开销: 如果插入或更新操作改变了聚集索引列的值,数据库可能需要移动数据行以维护物理排序,这可能导致页面分裂(Page Split),从而增加写操作的开销。
类比: 想象一本书,它的内容是按照页码(即主键)的顺序物理排列的。当你想找第 100 页的内容时,你直接翻到第 100 页即可,内容就在那里。
2. 非聚集索引(Non-clustered Index)
定义: 非聚集索引的物理存储顺序独立于数据行的物理存储顺序。它是一个单独的数据结构(通常也是 B+ 树),包含索引键值和指向实际数据行物理位置的指针。
特性:
多重性: 一个表可以有多个非聚集索引。因为非聚集索引不影响数据的物理存储,你可以为不同的列创建多个索引以支持不同的查询模式。
叶子节点存储指针: 非聚集索引的叶子节点不存储实际的数据行,而是存储索引键值以及一个行定位器(Row Locator),该定位器指向数据行在表中的位置。这个定位器可以是数据行的物理地址(对于堆表,即没有聚簇索引的表),或者更常见的是聚簇索引键值(如果表有聚簇索引)。
“回表”操作: 当通过非聚集索引查询数据时,数据库首 马来西亚赌博数据 先会通过非聚集索引找到对应的行定位器,然后使用这个定位器去查找实际的数据行。这个“通过非聚集索引找到行定位器,再通过行定位器找到数据行”的过程被称为**“回表(Lookup)”**操作。
适用于精确查找: 非聚集索引在精确查找(WHERE column = 'value')时效率很高,因为它能快速定位到对应的行定位器。
覆盖索引: 如果一个查询所需的所有列都包含在非聚集索引中(即索引本身包含了这些列),那么数据库就不需要执行“回表”操作,直接从索引中返回结果。这被称为覆盖索引(Covering Index),它可以显著提高查询性能。
类比: 想象一本书的“索引页”(例如,在书的末尾)。这个索引页按照字母顺序排列了书中的所有关键词,每个关键词后面跟着它出现的页码。当你查找一个词时,你先在索引页找到它,然后根据页码去书的对应页寻找具体内容。这个“根据页码去书的对应页寻找具体内容”的过程就是“回表”。
3. 核心区别对比
特性 聚集索引 (Clustered Index) 非聚集索引 (Non-clustered Index)
数据物理顺序 决定数据行的物理存储顺序。 不决定数据行的物理存储顺序。
数量限制 每个表只能有一个。 每个表可以有多个。
叶子节点内容 存储实际的数据行。 存储索引键值 + 行定位器(通常是聚簇索引键)。
查询性能 对于范围查询和按索引键排序的查询非常快。 对于精确查找非常快。
“回表”操作 不需要回表。 需要回表(除非是覆盖索引)。
存储开销 不会额外占用存储空间,因为数据本身就是索引的叶子节点。 需要额外存储空间来保存索引结构。
写操作影响 对插入/更新(特别是索引键列)性能影响较大,可能导致页分裂。 对插入/更新性能也有影响,但通常小于聚簇索引,因为它不改变数据物理顺序。
主键关系 默认情况下,主键通常是聚簇索引。 可以为任何列创建,包括非主键列。

Export to Sheets
总结
理解聚集索引和非聚集索引之间的差异对于数据库设计和性能优化至关重要。

选择聚集索引通常基于查询中最频繁用于范围查询、排序或作为连接条件的列。理想情况下,它应该是唯一的、递增的(以减少页分裂),并且经常被访问的列(例如,主键)。
选择非聚集索引则可以根据具体的查询模式来优化。如果某个列经常出现在 WHERE 子句中,或者经常用于 ORDER BY,即使它不是主键,也可以考虑为其创建非聚集索引。
合理地设计和使用这两种索引,可以显著提高数据库的查询效率,同时平衡数据修改的性能。
Post Reply