什么是聚簇索引和非聚簇索引?

聚簇索引

  • 定义

    聚簇索引的 索引顺序直接决定了数据行的物理存储顺序。索引的叶子节点(最底层)存储的是 完整的数据行,因此数据和索引是绑定在一起的。

  • 特点

    • 一个表只能有一个聚簇索引(因为数据只能按一种物理顺序存储)。
    • 通常由 主键(Primary Key) 自动创建,但如果没有主键,数据库会选择唯一非空列,或生成隐藏的ROWID。
    • 适合范围查询(如 BETWEEN><),因为数据在物理上是连续的。
  • 优点

    • 查询速度快:通过索引可直接获取数据,无需额外查找。
    • 范围查询高效:相邻数据在磁盘上连续存储,减少I/O次数。
  • 缺点

    • 插入速度受主键顺序影响:如果新数据的主键不连续,可能导致页分裂(Page Split),影响性能。
    • 更新主键代价高:修改主键值会导致数据行物理位置的变化。

非聚簇索引

  • 定义

    非聚簇索引的索引顺序与数据的物理存储顺序无关。其叶子节点存储的是 指向数据行的指针(如主键值或磁盘地址),而非数据本身。

  • 特点

    • 一个表可以有 多个非聚簇索引
    • 需要 回表(Bookmark Lookup):根据索引找到主键后,需通过主键回到聚簇索引中查找实际数据。
    • 适合精确查询(如 WHERE column = value)。
  • 优点

    • 灵活:可针对不同查询条件创建多个索引。
    • 占用空间较小:仅存储索引列和指针,不包含完整数据。
  • 缺点

    • 查询速度较慢:需要两次查找(索引→主键→数据)。
    • 范围查询效率低:数据行可能分散在磁盘不同位置。

对比总结

特性 聚簇索引 非聚簇索引
数据存储位置 索引叶子节点直接存数据 索引叶子节点存指针(主键)
数量限制 仅一个 多个
查询速度 快(无需回表) 慢(需回表)
范围查询效率 高(数据连续存储) 低(数据可能分散)
适用场景 主键查询、范围查询 频繁查询非主键列