[译]从磁盘结构到B+树

栏目: 数据库 · 发布时间: 5年前

内容简介:简单来说:按照时钟方向分,disk由很多个sector组成,编号为0-N。按照从外到内分,disk又由多个track组成,编号为0-N。sector和track交叉的地方,叫做block,每个block有自己的address,可以用(track_no,sector_no)表示。每个block的大小是一样的,具体的大小要看实际情况,在这里,我们假设一个block的大小是512bytes。需要十分明确的一点是:在block内部,可以看作是一个数组结构,坐标从0到511。每个byte都有一个address,这个称
[译]从磁盘结构到B+树

简单来说:按照时钟方向分,disk由很多个sector组成,编号为0-N。按照从外到内分,disk又由多个track组成,编号为0-N。sector和track交叉的地方,叫做block,每个block有自己的address,可以用(track_no,sector_no)表示。每个block的大小是一样的,具体的大小要看实际情况,在这里,我们假设一个block的大小是512bytes。

需要十分明确的一点是: 无论是读操作,还是写操作,都是以block为单位进行的。

[译]从磁盘结构到B+树

在block内部,可以看作是一个数组结构,坐标从0到511。每个byte都有一个address,这个称为offset。所以我们可以把disk上的每一个byte用(track_no,sector_no,offset)的形式表示。

在计算机中,disk的结构可以这么简要地表示。

[译]从磁盘结构到B+树

其中有一个读写头,每个时刻,读写头对准了disk上的其中一个block(track_no,sector_no)。通过旋转,可以改变sector_no,通过伸缩读写头,可以改变track_no。

还有一点,也是需要明确的:**只有disk上的数据被加载到RAM(random access memory),才能被程序使用。**或者说,才是真正对程序有用的。

[译]从磁盘结构到B+树

如何优化RAM中数据的效率,这门学问叫做数据结构;如何优化disk中数据的效率,这门学问叫做DBMS,也就是大部分数据库所要研究的内容。

disk是如何存储数据(特值定数据库数据)的

现在有一个employee table,其中有这些字段,每个字段的大小如图所示,一个record的大小总计为128 bytes。

[译]从磁盘结构到B+树

总共有100行数据:

[译]从磁盘结构到B+树

每个block可以存4行数据。存这100条数据,需要25个block。如果现在我们需要查询其中的一条数据,最多就需要查询25个block。

什么是索引

我们建一个简单的索引,有两个字段,一个eid,表示employee的id,还有一个字段pointer,指向数据存储在disk上的位置。empolyee中的每一行,在index上都有一条记录。

[译]从磁盘结构到B+树

那么我们又是怎么存储这个索引的呢?这里我们假设还是全部存在disk上(当然你完全可以选择直接存在内存里)。那么这个索引需要占据多少个block呢?eid大小为10bytes,pointer大小为6bytes,所以一行索引就有16个bytes大小。100条索引就需要占据100 * 16 / 512 -> 4个block。

那么现在要查询employee表中的某一条数据,最多需要查询多少个block呢?答案是4+1=5个。效率比之前要高了很多。

什么是多级索引

现在假设有1000条数据,这1000条数据将占据250个block,上一小节讲的索引将占据40个block。现在用索引查询一次,最多需要41次block access。现在这个索引已经不能满足我们对性能的追求了,那么能不能对索引建一个索引呢?也就是二级索引?

对于二级索引,不需要记录每条employee在disk的位置,只需要记录一级索引所有block的位置就行了。所以,二级索引需要40条记录,也就是需要占据2个block的空间。这种二级索引可以叫做稀疏索引,他不会包含所有数据行所在的位置。

[译]从磁盘结构到B+树

现在借助二级索引,查询效率为:2 + 1 + 1 = 4次block access。

随着数据量不断增加,还可以对二级索引建立三级索引,对三级索引建立四级索引……

[译]从磁盘结构到B+树

同时,我们还希望做到一点: 多级索引可以随着数据量的大小变化而自动创建和删除。 这就引出了主角:B树和B+树。

m-way搜索树

二叉搜索树:每个节点有一个值,有两个子节点。

[译]从磁盘结构到B+树

由二叉搜索树扩展,让每个节点最多可以存m-1个索引值,每个节点可以有m个子节点,就是m-way搜索树。

[译]从磁盘结构到B+树

上图所示的就是3-way搜索树。

下面的这个4-way搜索树,每个节点最多存了3个索引值,有4个指向子节点的pointer,同时还有指向数据项所在的位置的指针Rp。

[译]从磁盘结构到B+树

我们可以用这个m-way搜索树作为数据库的索引,但是,m-way搜索树存在一些问题:

比如现在有三个数据:10,20,30,要用一个10-way搜索树来构建。很有可能,最终会构建出一个这样的树:

[译]从磁盘结构到B+树

这是最糟糕的一种情况,最终。我们需要先把每个节点填满,然后才能创建下一个子节点。而m-way搜索树本身,并没有这种强制,你可以随意插入。

B树:m-way搜索树 + 规则

B树,实际上可以看作是m-way搜索树 + 规则(如何构建这棵树的规则)。

规则:

  • 每个节点至少有[m/2]个子节点
  • 根节点可以最少有2个子节点
  • 所有的叶子节点必须在一个层级
  • 创建过程是由下往上的

B树中的插入操作

值:10,20,40,50。要构建一个4-way搜索树。4-way搜索树,意味着一个节点最多可以有3个值。

[译]从磁盘结构到B+树

这实际上,也就构建了一个二级索引。上面的是第二层索引,下面的是第一层索引。每一层构成了一级索引。

继续插入60和70:

[译]从磁盘结构到B+树

接着插入80,右下的那个节点已经没有空位置了,所以需要新建一个节点,然后把70那个值提升到上一层。

[译]从磁盘结构到B+树

插入30:

[译]从磁盘结构到B+树

插入35:

[译]从磁盘结构到B+树

等等等等:

[译]从磁盘结构到B+树

每个值旁边,都有一个指向数据存储位置的指针。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

理想主义者

理想主义者

[美] 贾斯汀·彼得斯 / 程静、柳筠 / 重庆出版社 / 2018-5-15 / 49.80元

2013年1月11日,年仅26岁的黑客亚伦·斯沃茨自杀身亡,此事在美国引起轩然大波。这不仅是因为在互联网领域,斯沃茨是一个可以与比尔·盖茨、马克·扎克伯格、理查德·斯托曼等齐名的人,更是因为此事揭露了传统世界与互联网世界的规则冲突。 在互联网思维下,信息是明码标价的商品。各种利益方用技术竖起了一道道藩篱,将支付不起费用但渴望用知识改变命运的人隔绝在外。于是,一大批希望改变这种模式的“理想主义......一起来看看 《理想主义者》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码