【发布时间】:2016-08-26 10:18:50
【问题描述】:
我阅读了聚簇索引和非聚簇索引并得出结论,我们对聚簇索引使用散列,对非聚簇索引使用 B+ 树(或 B 树)。我的结论对吗?如果不是,那么这两者在数据结构层面有什么区别?
【问题讨论】:
标签: sql database indexing relational-database database-indexes
我阅读了聚簇索引和非聚簇索引并得出结论,我们对聚簇索引使用散列,对非聚簇索引使用 B+ 树(或 B 树)。我的结论对吗?如果不是,那么这两者在数据结构层面有什么区别?
【问题讨论】:
标签: sql database indexing relational-database database-indexes
这个答案是在问题似乎集中在 MySQL 时写的。
既然您已经标记了问题 [mysql],我们应该将讨论限制在 那个 RDBMS 的可能性上。
这些天您最应该使用的“引擎”是 InnoDB。它主要有 B+Tree 索引。 (它也有FULLTEXT 和SPATIAL,但我不会涉及它们。)它确实没有有“哈希”。
PRIMARY KEY 是一个聚集的 B+Tree。所有数据都按PK排序并存储到那个B+Tree中。 PK只能是集群的,只能是BTree。 PK 也是唯一的(在 MySQL 中)。
辅助键也是 B+树。它们包含二级索引的列。叶节点是主键的列。通过二级索引的“点查询”需要向下钻取二级 BTree,然后向下钻取主键。辅助键不能“聚集”。
对于一般用途,BTree 是最好的。哈希很少会更好。 Hash 对于范围扫描是没有用的,而 BTree,尤其是 B+Tree,非常适合这种情况。
当索引大于可以缓存在 RAM 中时,哈希是很糟糕的。通常,您要访问的“下一个”键与您触摸的最后一个键不相邻,因此很有可能需要 I/O。
【讨论】:
简单来说,我们可以像下面这样解释。
聚集索引和非聚集索引都遵循 b-tree 结构,
for clustered index leaf node of the b-tree structure contains the Actual data.
for non clustered index leaf node of the b-tree structure points the address of the actual data.
【讨论】: