说实话 如果你可以在解释聚簇索引和非聚簇索引的区别和联系的时候,脑袋里面能够出现两颗B+树 实际上就很好解释两者大的关系。
-
聚簇索引(Clustered Index):
- 非叶子节点:存储的是索引的键值(即主键值),用于导航到对应的叶子节点。
- 叶子节点:存储索引的键值和整个数据行本身。因为聚簇索引的叶子节点包含完整的数据行,所以通过聚簇索引可以直接获取数据行,无需额外的查找操作。
-
非聚簇索引(Secondary Index):
- 非叶子节点:同样存储的是索引的键值(辅助索引列的值),用于导航到对应的叶子节点。
- 叶子节点:存储索引的键值和指向聚簇索引键的指针。通过这个指针(聚簇索引键)可以进一步访问聚簇索引,从而获取整个数据行。叶子节点并不直接包含完整的数据行,而是通过聚簇索引键来定位。
这样的结构设计使得聚簇索引能够直接通过索引访问数据行,而非聚簇索引则通过两步查询实现对数据行的访问:首先通过辅助索引找到聚簇索引键,然后通过聚簇索引键再次查找到整个数据行。
总结起来,聚簇索引的叶子节点直接存储整个数据行,而非聚簇索引的叶子节点存储索引键值和聚簇索引键的指针。
还有如果能够理解聚簇和非聚簇索引叶子节点和非叶子节点存储的是什么东西 说明已经掌握了:
聚簇索引的非叶子节点存储的是索引的键值,而叶子节点存储索引的键值和数据行本身; 而非聚簇索引的非叶子节点也是存储该索引的键值,而叶子节点存储索引的键值和聚簇索引的键值。
(非叶子节点用来找叶子节点用的。叶子节点用来找数据用的)