跳至主要內容

什么是聚族索引?

fangzhipeng约 956 字大约 3 分钟

什么是聚簇索引

聚簇索引是数据库中的一种索引类型,它对表中的数据行进行排序,并将数据行直接存储在索引的叶子节点中。对于使用聚簇索引的表,数据行按照索引的键值顺序存储在磁盘上。

聚簇索引的优点包括:

  • 加速数据检索:由于数据行按照索引的顺序存储,因此使用聚簇索引可以加速范围查询和排序操作。-
  • 减少磁盘 I/O:聚簇索引可以减少磁盘 I/O 操作,因为查询可以直接定位到数据行所在的位置。
  • 支持覆盖索引:在某些情况下,聚簇索引还可以支持覆盖索引,即索引中包含了查询所需的所有列,不需要再访问数据行。

需要注意的是,由于聚簇索引决定了数据的物理存储方式,因此在频繁进行插入、更新和删除操作时,可能会导致数据页的频繁分裂和合并,进而影响性能。

比如我们创建一个goods表,它的表ddl如下 :

create table goods(
    id int primary key, 
    name varchar(16),
    category_id int not null, 
    index (category_id)
)engine=InnoDB;


添加数据:

insert into goods(id,name,category_id) values(100,'手机',1),(200,'电脑',2),(300,'汽车',3);

goods 表中有一个聚簇索引id,和一个非聚簇索引 category_id。

聚簇索引id的对应的B+树如下图所示:

image-20240312232335101
image-20240312232335101

什么是非聚簇索引

非聚簇索引在 InnoDB 引擎中,也叫二级索引,与聚簇索引相对应。与聚簇索引不同,非聚簇索引在索引的叶子节点中不直接存储数据行,而是存储指向数据行的指针,通常是ID。

使用非聚簇索引进行查询时,数据库引擎首先根据索引找到对应的行标识符,然后再根据行标识符去表中找到实际的数据行。这样的索引结构使得非聚簇索引在查询时需要进行两次查找,一次是在索引上,另一次是在表上,因此在某些情况下可能会引入额外的 I/O 开销。

非聚簇索引的优点包括:

  1. 支持多个索引:相比于聚簇索引,非聚簇索引允许在同一张表上创建多个不同的索引。

  2. 减少索引维护开销:由于非聚簇索引的叶子节点不包含实际数据行,因此对于插入、更新和删除操作的影响较小,不会像聚簇索引那样频繁地引起数据页的分裂和合并。

  3. 适用于覆盖索引:非聚簇索引适合作为覆盖索引,即索引中包含了查询所需的所有列,从而避免了对表的实际数据行的访问。

以上面 goods 表为例,在 goods 中非聚簇索引 category_id 对应 B+ 树如下图所示:

image-20240312233025028
image-20240312233025028

非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID。使用非聚簇索引进行查询时,首先会查找到主键 ID,然后再使用主键 ID 去聚簇索引上找到真正的行数据。

总结

当使用聚簇索引进行查询时,可以直接通过索引找到对应的行数据,而非聚簇索引需要先找到聚簇索引的值,再根据这个值去找行数据,因此查询效率稍低。另外,一个表只能有一个聚簇索引,但可以有多个非聚簇索引。

方志朋_官方公众号
方志朋_官方公众号