MySQL索引原理B+树,凭借这份Java⾯试题集
RR:RightRight,也称“右右”。插⼊或删除⼀个节点后,根节点的右孩⼦(Right Child)的右孩⼦(Right Child)还有⾮空节点,导致根节点的右⼦树⾼度⽐左⼦树⾼度⾼2,AVL树失去平衡。
LR:LeftRight,也称“左右”。插⼊或删除⼀个节点后,根节点的左孩⼦(Left Child)的右孩⼦(Right Child)还有⾮空节点,导致根节点的左⼦树⾼度⽐右⼦树⾼度⾼2,AVL树失去平衡。
RL:RightLeft,也称“右左”。插⼊或删除⼀个节点后,根节点的右孩⼦(Right Child)的左孩⼦(Left Child)还有⾮空节点,导致根节点的右⼦树⾼度⽐左⼦树⾼度⾼2,AVL树失去平衡。
AVL树失去平衡之后,可以通过旋转使其恢复平衡。下⾯分别介绍四种失去平衡的情况下对应的旋转⽅法。
LL的旋转。LL失去平衡的情况下,可以通过⼀次旋转让AVL树恢复平衡。步骤如下:
1. 将根节点的左孩⼦作为新根节点。
2. 将新根节点的右孩⼦作为原根节点的左孩⼦。
3. 将原根节点作为新根节点的右孩⼦。
LL旋转⽰意图如下:
RR的旋转:RR失去平衡的情况下,旋转⽅法与LL旋转对称,步骤如下:
1. 将根节点的右孩⼦作为新根节点。
2. 将新根节点的左孩⼦作为原根节点的右孩⼦。
3. 将原根节点作为新根节点的左孩⼦。
RR旋转⽰意图如下:
LR的旋转:LR失去平衡的情况下,需要进⾏两次旋转,步骤如下:
1. 围绕根节点的左孩⼦进⾏RR旋转。
2. 围绕根节点进⾏LL旋转。
LR的旋转⽰意图如下:
RL的旋转:RL失去平衡的情况下也需要进⾏两次旋转,旋转⽅法与LR旋转对称,步骤如下:
1. 围绕根节点的右孩⼦进⾏LL旋转。
2. 围绕根节点进⾏RR旋转。
RL的旋转⽰意图如下:
葡萄牙摩洛哥直播⼆、平衡多路查树(B-Tree)
B-Tree是为磁盘等外存储设备设计的⼀种平衡查树。因此在讲B-Tree之前先了解下磁盘的相关知识。
系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同⼀个磁盘块中的数据会被⼀次性读取出来,⽽不是需要什么取什么。
InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最⼩单位。InnoDB存储引擎中默认每个页的⼤⼩为16KB,可通过参数innodb_page_size将页的⼤⼩设置为4K、8K、16K,在MySQL中可通过如下命令查看页的⼤⼩:
mysql> show variables like ‘innodb_page_size’;
⽽系统⼀个磁盘块的存储空间往往没有这么⼤,因此InnoDB每次申请磁盘空间时都会是若⼲地址连续磁盘块来达到页的⼤⼩16KB。InnoDB在把磁盘数据读⼊到磁盘时会以页为基本单位,在查询数据时如果⼀个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提⾼查询效率。
mysql面试题sqlB-Tree结构的数据可以让系统⾼效的到数据所在的磁盘块。为了描述B-Tree,⾸先定义⼀条记录为⼀个⼆元组[key, data] ,key为记录的键值,对应表中的主键值,data为⼀⾏记录中除主键外的数据。
对于不同的记录,key值互不相同。
⼀棵m阶的B-Tree有如下特性:
1. 每个节点最多有m个孩⼦。
closeyour eyes是什么意思2. 除了根节点和叶⼦节点外,其它每个节点⾄少有Ceil(m/2)个孩⼦。
3. 若根节点不是叶⼦节点,则⾄少有2个孩⼦
4. 所有叶⼦节点都在同⼀层,且不包含其它关键字信息
5\
html 中liststyle《⼀线⼤⼚Java⾯试题解析+后端开发学习笔记+最新架构讲解视频+实战项⽬源码讲义》
shell脚本实例讲解【docs.qq/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
. 每个⾮终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
6. 关键字的个数n满⾜:ceil(m/2)-1 <= n <= m-1
7. ki(i=1,…n)为关键字,且关键字升序排序。
8. Pi(i=1,…n)为指向⼦树根节点的指针。P(i-1)指向的⼦树的所有节点关键字均⼩于ki,但都⼤于k(i-1)
B-Tree中的每个节点根据实际情况可以包含⼤量的关键字信息和分⽀,如下图所⽰为⼀个3阶的B-Tree:
每个节点占⽤⼀个盘块的磁盘空间,⼀个节点上有两个升序排序的关键字和三个指向⼦树根节点的指针,指针存储的是⼦节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的⼦
树的数据的范围域。以根节点为例,关键字为17和35,P1指针指向的⼦树的数据范围为⼩于17,P2指针指向的⼦树的数据范围为17~35,P3指针指向的⼦树的数据范围为⼤于35。
模拟查关键字29的过程:
根据根节点到磁盘块1,读⼊内存。【磁盘I/O操作第1次】
⽐较关键字29在区间(17,35),到磁盘块1的指针P2。
根据P2指针到磁盘块3,读⼊内存。【磁盘I/O操作第2次】
⽐较关键字29在区间(26,30),到磁盘块3的指针P2。
根据P2指针到磁盘块8,读⼊内存。【磁盘I/O操作第3次】
在磁盘块8中的关键字列表中到关键字29。
分析上⾯过程,发现需要3次磁盘I/O操作,和3次内存查操作。由于内存中的关键字是⼀个有序表结构,可以利⽤⼆分法查提⾼效率。⽽3次磁盘I/O操作是影响整个B-Tree查效率的决定因素。B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作⽤,从⽽提⾼了查询效率。
三、B+Tree
winccc脚本编程入门B+Tree是在B-Tree基础上的⼀种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是⽤B+Tree实现其索引结构。
从上⼀节中的B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。⽽每⼀个页的存储空间是有限的,如果data数据较⼤时将会导致每个节点(即⼀个页)能存储的key的数量很⼩,当存储的数据量很⼤时同样会导致B-Tree的深度较⼤,增⼤查询时的磁盘
I/O次数,进⽽影响查询效率。在B+Tree中,所有数据记录节点都是按照键值⼤⼩顺序存放在同⼀层的叶⼦节点上,⽽⾮叶⼦节点上只存储key值信息,这样可以⼤⼤加⼤每个节点存储的key值数量,降低B+Tree的⾼度。
B+Tree相对于B-Tree有⼏点不同:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论