pyt*_*hon 5 mysql sql indexing b-tree clustered-index
目前我正在阅读B+ Tree基础知识,并对聚集和非聚集索引的空间分配感到困惑。
当我们在 上创建聚集索引时B+ tree,索引将存储在主内存中,并且叶子包含指向实际块的数据指针。块存储在磁盘中,块中包含记录。
现在假设我们有一个表(idname 、 name 、 class ),并且我在和上创建了两个非聚集索引class。我的疑问是非聚集索引将存储在哪里?以及如何搜索query类似内容
select id, name, class from table where id = 3, name='Leo' and class='10'
Run Code Online (Sandbox Code Playgroud)
我的假设:
name现在使用和上的非聚集索引class,我们将找到剩余的字段你认为我的假设正确吗?您能否详细说明一下存储聚集索引的情况?两个索引(聚集索引和非聚集索引是否形成n叉树?)。我无法同时可视化聚集索引和非聚集索引。
我正在专门谈论 InnoDB...
(正如PRIMARY KEY你所说)与数据聚集在一起。整个 BTree(数据 + PK)存储在磁盘上的一组块中(而不是“主内存”)。“叶”节点包含所有列。
辅助键是一个单独的 BTree。从结构上来说,这两个 BTree 是相同的,除了叶节点中的内容不同。对于辅助键,其副本PRIMARY KEY被放入叶节点中。因此,当使用二级索引查找一行(“点查询”)时,有两个 BTree 向下钻取 - 一个用于二级索引,另一个用于 PK。
所有块都“缓存”在“buffer_pool”中,因此它们有时位于主内存中,但总是(迟早)保留在磁盘上。(事务日志等)确保“稍后”不会违反数据始终保留的规则。)
你的两张照片是一个很好的开始。然而...
您需要了解比图片试图传达的更高层次的信息:
WHERE clustered_key BETWEEN ...非常有效WHERE secondary_key BETWEEN ...在查找所需的 PK 值方面非常有效,但随后会变成一堆(可能)随机点查询。现在介绍 MyISAM:
(还有很多细节。)