什么是聚簇索引和非聚簇索引?
聚簇索引
-
定义
聚簇索引的 索引顺序直接决定了数据行的物理存储顺序。索引的叶子节点(最底层)存储的是 完整的数据行,因此数据和索引是绑定在一起的。
-
特点
- 一个表只能有一个聚簇索引(因为数据只能按一种物理顺序存储)。
- 通常由 主键(Primary Key) 自动创建,但如果没有主键,数据库会选择唯一非空列,或生成隐藏的ROWID。
- 适合范围查询(如
BETWEEN
、>
、<
),因为数据在物理上是连续的。
-
优点
- 查询速度快:通过索引可直接获取数据,无需额外查找。
- 范围查询高效:相邻数据在磁盘上连续存储,减少I/O次数。
-
缺点
- 插入速度受主键顺序影响:如果新数据的主键不连续,可能导致页分裂(Page Split),影响性能。
- 更新主键代价高:修改主键值会导致数据行物理位置的变化。
非聚簇索引
-
定义
非聚簇索引的索引顺序与数据的物理存储顺序无关。其叶子节点存储的是 指向数据行的指针(如主键值或磁盘地址),而非数据本身。
-
特点
- 一个表可以有 多个非聚簇索引。
- 需要 回表(Bookmark Lookup):根据索引找到主键后,需通过主键回到聚簇索引中查找实际数据。
- 适合精确查询(如
WHERE column = value
)。
-
优点
- 灵活:可针对不同查询条件创建多个索引。
- 占用空间较小:仅存储索引列和指针,不包含完整数据。
-
缺点
- 查询速度较慢:需要两次查找(索引→主键→数据)。
- 范围查询效率低:数据行可能分散在磁盘不同位置。
对比总结
特性 | 聚簇索引 | 非聚簇索引 |
---|---|---|
数据存储位置 | 索引叶子节点直接存数据 | 索引叶子节点存指针(主键) |
数量限制 | 仅一个 | 多个 |
查询速度 | 快(无需回表) | 慢(需回表) |
范围查询效率 | 高(数据连续存储) | 低(数据可能分散) |
适用场景 | 主键查询、范围查询 | 频繁查询非主键列 |