• B树,B+树,以及它们和数据库索引之间的关系


    这是一篇学习笔记,原视频传送门。此人讲解十分清楚,唯一缺点是印度英语口音不好辨识。

    学习B树和B+树,需要从以下几方面来理解,直接上来整定义,很难懂。

    知识点如下:

    1. 磁盘结构

    2. 数据如何在磁盘中存储

    3. 什么是索引

    4. 什么是多级索引

    5. m-way搜索树(二叉搜索树BST的推广)

    6. B树

    7. B树的插入和删除

    8. B+树

     一、磁盘结构

    磁盘(硬盘)中存储介质是圆形的,类似光盘。数据记录在这些圆盘上(别问怎么存的,问就是不懂).那么怎么在圆盘上进行定位呢?

    类似于平面直角坐标系, 我们用x轴和y轴, 任何一个点只要知道(x,y)坐标即可定位.

    磁盘上,我们用磁道(track)和扇区(sector)来定位. 磁道就是一圈一圈的同心圆,扇区就是把大圆切成的几个大扇形.

    所以用(trackno, sectorno)这个坐标就可以定位到一个块(block), 数据就存在这个block里, 块是存储的最小单元, 通常大小为512字节.

    能够定位到一个块了, 但这个块有512个字节,  所以还得一个offset偏移量, 来准确把数据定位到究竟是哪一个字节.

     程序从硬盘里读取数据到内存,计算机学科中的研究领域也在此分为两部分,研究(内存中的)数据及其关系就是数据结构, 研究数据如何在磁盘中高效存取的就是DBMS数据库. 

     二、数据如何在磁盘中存储

    现在假设我们有一张数据表, employee表. 假设各个字段长度如下, 加起来刚好128字节. 意思就是表中的一行(一条记录)大小为128字节.

    假如有100行数据, 共12800字节,每个块能存512字节,那就需要25个块.

    4行记录刚好512字节,一个块。

     

     三、索引

     为了快速查找到底是哪25个块记录着这些数据,我们要给数据建立索引。索引由employee表的id作为查找key,value是一个指向哪个block的指针。

     索引也是数据,也得存磁盘里。也就是它也得存到block里。假设一行索引16字节。那么32条数据占一个block,100条数据占3.2个块四舍五入4个block。

    那么查找一个数据,先在索引里找,最多需要查4个block,完了从数据里查,直接通过索引能查到一个block,一共读了5个block,比直接在数据里查25个block少了很多。

    四、多级索引

    如果有1000条数据,之前100条数据,它的索引占了4个block,那1000条数据的索引就占了40个block(随便算的,并不严谨)。

    为了更快查找,我们可以给这40个block也简历索引,就是多级索引了,暂时称为二级索引吧。二级索引的第一条记录,指向一级索引的第一个block(32行),

    一级索引一共有占据40个block,那么二级索引就一共有40行,32行占一个字节,40/32,二级索引一共只占1.2约等于2个block。

    查找时,二级(2个block)->一级(1个block)->数据(1个block),大大缩减了查找时读取磁盘块的数量。

     

     五、M-路搜索树

    多级索引,就是一层一层的对数据、索引所在的block进行指针指向,它看起来已经很像树型结构了。但我们需要的是一共能够自我调整(增加级数、减少级数)的树。

     回忆一下二叉搜索树,一个节点中只有一个数字(一个key),按照左小右大,它有两个孩子。

     m-way搜索树,每个节点中有m-1个key,由小到大k1<k2<...<km-1,它可以有m个孩子,思想和二叉搜索树一样,比key小的在key的左分支,比key大的在key的右分支。

    一个4-way搜索树的节点内部结构如下。

     这种m-way搜索树可以用来存索引吗?可以,比如下面这个4路的,Rp是指向表中数据所在位置的指针。

    但是m-way搜索树有些问题,第一,因为它的定义简单(类似二叉搜索树),直接按照定义来插入数据,会产生不平衡的树。比如一个度为10的m-way搜索树,

    本来一个节点能放9个key,但是直接插入的话,它就成了单边树。

     第二它不能自我管理。

     六、B树

    B树就是一棵m-way搜索树上增加了一些定义和限制条件。假设度为m(意思是一个节点最多有m个孩子)

    1. 每个节点至少得有[m/2] (上取整)个子树;(此定义是用来控制树的高度,防止单边树产生) 

    2. 根节点最少可以有两个孩子(子树);(这条定义是用来特殊处理根节点的。假如没有此定义,整棵树都没法生成,新加入

    的数据全得往子树里放,根节点的key加不进去。)

    3. 所有叶子节点都在同一层;

    4. 建立树是一个从底向上的过程;

     七. B树的插入

    下面是一个B树创建的例子,度为4,key最多为3.

    插入10, 20, 40后, 50没地方放了。做法是开始分割节点,以分界点40作为父节点,10、20放一个节点,50放一个节点(这种分级点选择方法默认把较多数据放到节点左边)。

     

     接着插入60, 70, 插入80的时候再次分割,并且把分界点70送到父节点中。

     

     

    更够自动调整层高和节点大小的B树,其结构已经很像数据库的多级索引了,下图红框意思是指向数据的指针。节点里的key就是索引的id。

     

    八、B+树

    1. B树中,所有节点都有指向索引地址的指针。B+树中只有叶子节点有这种指针。

    2. B+树中,叶子节点中会有其根节点的一份copy,

    3. 叶子节点互相连接;

    4. B+树的结构更像多级索引,只有一级索引上有连接至数据地址的指针。

    只有第一级索引是dense的,其他高级索引是sparse的。

     

    这是两个B树和B+树在线可视化过程的链接

    https://www.cs.usfca.edu/~galles/visualization/BTree.html

    https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

  • 相关阅读:
    合一算法最新版
    string.at(i)
    字符串逆转
    String
    Vector
    1005POJ
    但愿天堂一切都好
    合一算法
    合一算法2
    BTREE与其它索引的优缺点对比
  • 原文地址:https://www.cnblogs.com/importsober/p/12714408.html
Copyright © 2020-2023  润新知