23. 什么是非聚簇索引(Non-Clustered Index)?它与聚簇索引有什么区别?
大约 3 分钟
非聚簇索引(Non-Clustered Index)是一种在数据库表中为某些列创建的索引结构,它包含了列的索引键值及其对应的行指针(或行ID)。这些指针指向实际数据在表中的存储位置。非聚簇索引的索引键值与数据存储位置是分开的,索引本身只包含索引列和对应的指针,而数据则存储在表的其他位置。
在一个表中,可以创建多个非聚簇索引,每个索引都独立存在,针对不同的列或组合列进行优化查询。
聚簇索引(Clustered Index)与非聚簇索引的区别
特性 | 聚簇索引(Clustered Index) | 非聚簇索引(Non-Clustered Index) |
---|---|---|
数据存储方式 | 聚簇索引决定了表中数据的物理存储顺序。表的数据行按索引键的顺序存储。 | 非聚簇索引的索引键与实际数据存储位置分离,索引只存储键值及其对应的行指针。 |
索引结构 | 聚簇索引本身就是数据,索引节点包含了实际的数据行。 | 非聚簇索引是独立于数据存储的结构,索引节点包含指向数据行的指针。 |
索引数量 | 每个表只能有一个聚簇索引。 | 每个表可以有多个非聚簇索引。 |
检索速度 | 对于基于聚簇索引的查询,数据检索非常快,因为数据存储顺序与索引顺序一致。 | 非聚簇索引检索速度较慢,因为需要先通过索引查找到数据的物理位置,再去查找实际数据。 |
应用场景 | 适用于需要对某列进行大量排序、范围查询的场景。 | 适用于精确匹配查询、少量更新或插入的场景,特别是需要多列进行查询优化时。 |
数据存储顺序的影响 | 聚簇索引会影响表的物理数据存储顺序,插入操作可能需要移动数据来保持顺序。 | 非聚簇索引不会影响表的物理数据存储顺序,插入和更新操作的影响较小。 |
空间开销 | 聚簇索引不需要额外的存储空间,因为数据行存储在索引叶节点中。 | 非聚簇索引需要额外的存储空间来维护索引结构及行指针。 |
举例说明
假设有一个包含id
和name
列的表:
- 聚簇索引:如果在
id
列上创建了聚簇索引,那么数据表将根据id
列的值进行物理排序。数据行按照id
列的顺序存储,并且表中只能有这一个聚簇索引。 - 非聚簇索引:如果在
name
列上创建了非聚簇索引,MySQL会为name
列生成一个独立的索引结构,这个索引结构包含了name
列的值和指向实际数据行的指针。查询时,MySQL会先通过非聚簇索引找到name
对应的行指针,再通过这个指针去表中查找对应的完整数据行。
总结
- 聚簇索引:数据物理上按照索引顺序存储,表中只能有一个聚簇索引,适合需要对数据进行排序或范围查询的场景。
- 非聚簇索引:索引键值与数据存储位置分离,表中可以有多个非聚簇索引,适合用于快速定位和多列查询优化。
在实际应用中,选择合适的索引类型可以大大提升数据库查询性能。通常,主键会被用作聚簇索引,而非聚簇索引则用于其他需要加速查询的列。