MYSQL

1. 聚簇索引(Clustered Index)

聚簇索引是一种将数据存储和索引结合的索引形式。在 MySQL 中,聚簇索引是一种数据存储方式,表中的行数据存储在索引本身的叶子节点上。因此,聚簇索引上的叶子节点包含了实际的数据行。换句话说,数据行按照聚簇索引的顺序物理存储在磁盘上,索引与数据“聚合”在一起。

聚簇索引的特点包括:

  • InnoDB 默认主键作为聚簇索引:在 InnoDB 存储引擎中,聚簇索引总是基于主键。如果没有定义主键,InnoDB 会尝试选择一个唯一的非空索引作为聚簇索引;如果都没有,就会创建一个隐藏的 6 字节的唯一 ID 列作为聚簇索引。
  • 每张表只能有一个聚簇索引:因为表数据只能按一个顺序存储,因此一个表只能有一个聚簇索引。

优点:

  • 数据访问快:因为数据和索引存储在一起,按聚簇索引查找数据非常快。
  • 范围查询性能高:对于范围查询,聚簇索引可以快速定位到数据的起始点,减少磁盘 I/O。

缺点:

  • 插入、删除和更新成本高:因为数据行的物理顺序和聚簇索引的顺序一致,插入、删除、更新操作会影响数据行的存储顺序,可能会导致频繁的页分裂和页合并,增加了操作的复杂性和成本。
  • 占用更多的空间:因为聚簇索引包含了数据本身,如果表很大,索引的体积也会很大。

2. 非聚簇索引(Non-clustered Index)

非聚簇索引是一种独立于数据的索引结构,索引和数据存储在不同的物理位置上。非聚簇索引的叶子节点只包含键值以及指向数据行的指针(如行指针或主键值),而不包含实际的数据行。

非聚簇索引的特点包括:

  • 索引和数据分离:非聚簇索引的叶子节点包含了指向数据的引用,而不包含数据本身。
  • 可以有多个非聚簇索引:因为非聚簇索引不影响数据的物理存储顺序,因此一个表可以有多个非聚簇索引。
  • 适用于多种查询:非聚簇索引适合频繁查询的列,尤其是那些不用于排序或范围查询的列。

优点:

  • 更新效率高:因为非聚簇索引不影响数据行的存储顺序,数据插入、删除和更新操作不会影响索引的结构。
  • 支持多列索引:非聚簇索引可以更灵活地支持多个查询需求。

缺点:

  • 数据访问稍慢:由于非聚簇索引指向数据行的位置,而不是直接存储数据,因此需要多一次查找操作。
  • 可能需要回表:对于非聚簇索引查询,如果查询的列不在索引中,则需要回表查找数据。