目前我正在阅读有关B+ Tree
基础知识的内容,并对群集和非群集索引的空间分配感到困惑。
当我们在B+ tree
上创建聚簇索引时,索引会存储在主内存中,而叶子包含指向实际块的数据指针。块存储在磁盘中,块包含记录。
现在假设我们有一个表( id ,名称,类),我在name
和class
上创建了两个非聚簇索引。 我怀疑非聚集索引将存储在哪里?以及如何为query
之类的
select id, name, class from table where id = 3, name='Leo' and class='10'
我的假设:
name
和class
上的非聚集索引,我们会找到其余字段你认为我的假设是对的吗?你能详细说明存储聚集索引吗? 索引(群集和非群集是否构成n-ary树?)。我无法同时将聚簇索引和非聚簇索引可视化。
答案 0 :(得分:2)
我是专门谈论InnoDB ...
PRIMARY KEY
(如你所说)与数据聚集在一起。整个BTree(数据+ PK)存储在磁盘上的一组块中(不是“主存储器”)。 'leaf'节点包含所有列。
辅助密钥是单独的BTree。在结构上,两个BTree是相同的,除了叶节点中的内容。对于辅助密钥,PRIMARY KEY
的副本将放入叶节点。因此,当使用二级索引查找一行(“点查询”)时,有两个BTree下钻 - 一个用于二级索引,一个用于PK。
所有块都在'buffer_pool'中'缓存',因此它们在主内存中有时,但始终在磁盘上保留(迟早)。 (事务日志等)确保“以后”不违反数据始终存在的规则。)
你的两张照片是个不错的开始。然而...
你需要知道的更高层次,而不是图片试图表达的内容:
WHERE clustered_key BETWEEN ...
非常有效WHERE secondary_key BETWEEN ...
非常有效地找到它需要的PK值,但随后变成了一堆(可能的)随机点查询。现在为MyISAM:
(还有更多细节。)