深入原理64式:16 B树,B+树与mysql索引

本文深入剖析了B树和B+树的原理,包括它们的定义、特点、查找、插入和删除操作,强调了B+树在数据库索引中的优势。接着详细讨论了MySQL索引的基础知识,如主键索引、唯一索引、普通索引、范围查找和最左匹配原则,并分析了如何优化查询。最后,探讨了InnoDB存储引擎为何使用B+树以及其对存储和查询性能的影响,同时还介绍了MySQL的优化策略和事务概念。
摘要由CSDN通过智能技术生成

1 B树
1.1 基础知识
含义: 多路平衡查找树
阶: B树中所有结点的孩子结点数的最大值,用m表示
特点:
1) 树的每个结点至多有m棵子树(m-1个关键字)
2) 若根结点不是终端结点,则至少有两棵子树
3) 除根节点以外的所有非叶结点至少有m/2向上取整棵子树
4) 所有非叶节点结构如下:
n Po K1 P1 K2 ... Kn Pn
解释:
K表示关键字,P表示指向子树根节点的指针,n为结点中关键字个数。
满足: Pi-1所指子树的所有结点的关键字都小于Ki, Pi所指子树的所有结点的关键字都大于Ki。
5) 所有叶节点都出现在同一层次上,并且不带信息。表示是查找失败结点。

总结: m棵子树,非叶节至少有m/2向上取整棵子树,Pi-1所指节点<Ki<Pi所指节点

三阶B树样例:
                    18 33
                
        12            23 30            48
        
    10        15    20 21 24    31    45 47 50 52
  空  空  空 空 空空空空空空空空空空空空空空空空

  
1.2 B树高度(磁盘存取次数)
B树的高度不包括最后的不带任何信息的叶节点所处的那一层。
若n>=1,对任意一棵包含n个关键字,高度为h,阶数为m的B树:
1) 每个结点最多有m棵子树, m-1个关键字,满足:
n <= (m-1)*(1 + m + m^2 + ... + m^(h-1)) = m^h - 1
即: h >= LOGm(n+1)

2) 若每个结点中关键字个数最少,第一层有1个结点,第二层有2个结点,
除根节点以外的每个非终端结点至少有m/2向上取整棵子树,第三层至少有2[m/2],
第h+1层至少有2([m/2])^(h-1),对于关键字个数为n的B树,叶节点即查找不成功的结点为
n+1,n+1>=2([m/2])^(h-1),即 h <= LOG[m/2]((n+1)/2) + 1

1.3 B树的查找
每个结点都是多个关键字的有序表,根据该结点的子树所做的多路分支决定。
B树查找包含:
1)在B树种找结点
2)在结点内找关键字(可采用折半查找等于K的关键字)
查找到某个结点后,先在有序表中进行查找,若找到则查找成功,否则按照对应指针信息到所
指的子树中取查找。当查找到叶节点,则查找失败。

1.4 B树的插入
1) 定位
利用B树查找算法,找出插入该关键字的最底层中某个非叶节点
2) 插入
每个非失败结点的关键字个数都在[m/2向上取整-1, m-1]之间。
当插入的关键字个数<=m-1,则直接插入;否则,需要进行分裂
3) 分裂
取一个新结点,将插入key后的原结点从中间位置将关键分为两部分,
左部分包含的关键字放在原结点,
右部分包含的关键字放在新结点,
中间位置m/2的结点插入到原结点的父节点中。若父节点关键字个数也超出上限,则继续分裂。

样例:
m为3的B树如下:
    30
20        50 52
插入60
    30
20        50 52 60
分裂后
    30 52
20      50    60

1.5 B树的删除
要使得删除后的结点中的关键字个数>=m/2向上取整-1,因此设计结点的合并问题。
1.5.1) 当所删除的关键字k不在终端结点(最底层非叶节点)中时,
1) 如果小于k的子树中关键字个数 > m/2向上取整-1,则找出k的前驱值k*,用k*取代k,
再递归删除k*即可。
2) 如果大于k的子树中关键字个数 > m/2向上取整-1,则找出k的后继值k*,用k*取代k,
再递归删除k*即可。
3) 如果前后两个子树中关键字个数均为m/2向上取整-1,则直接将两个子结点合并,直接删除k即可。

样例:
4阶B树如下
            5     7    9     
          3   6      8      10
删除7变为
            5      9
          3   6 8   10
          

1.5.2) 当被删除的关键字在终端结点(最底层非叶节点)
1) 直接删除关键字
若被删除关键字所在结点的关键字个数 > m/2向上取整-1,表明删除关键字满足B树定义,直接删除
2) 兄弟够借
若被删除关键字所在结点删除前关键字个数=m/2向上取整-1,且与此结点相邻的右(左)兄弟结点
的关键字个数>=m/2向上取整,则需要调整该及结点、右(左)兄弟结点及其双亲结点(父子换位法),以达到新的平衡
    60    71
  5   65    74 86
删除65,兄弟够借,将删除结点的父节点取代待删除结点位置,将其右兄弟第一个结点取代待删除结点原来父节点的位置
    60  74
 5    71   86
 
3) 兄弟不够借
若被删除关键字所在结点删除前的关键字个数为m/2向上取整-1,左右兄弟结点关键字个数也是m/2向上取整-1,
则将关键字删除后与右(左)兄弟结点以及双亲结点中的关键字进行合并。
    60  74
 5    71   86
删除5,兄弟不够借
     74
60 71    86

若合并过程中,双亲结点关键字个数减为0,则删除该根结点,合并后的新结点称为根结点;
若双亲结点不是根结点,且关键字个数减少为m/2向上取整-2,则需要与兄弟结点进行调整或合并。
      

2 B+树
2.1 B+树条件
一棵m阶B+树满足如下条件:
1) 每个分治结点最多有m棵子树
2) 根节点至少有两个子树&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值