常见问题:MySQL/B+树
平衡二叉树
此前讲红黑树时也提到了平衡二叉树,红黑树和AVL树都是能保证树不退化的平衡二叉树,平衡二叉树采用二分思想组织数据,能大大提高单点查找数据的效率,其组装过程略。
作为对比,此处也列出平衡二叉树规则
- 节点最多有两个子节点。
- 节点大于其左子节点小于其右子节点。
- 树的左右两边层级最多相差不大于1。
但平衡二叉树的性能和层级成反比,如果层级过多,则影响效率。因此数据库使用平衡二叉树组织数据过于低效,产生了B树。
B树
结构
B树即多路平衡查找树,也叫多叉树,其规则如下:
- 递增排序,左小右大。
- 一个节点的子节点数在(1,m]且m>=2。
- 一个节点的关键字数量为[(m-1)/2,m)。
- 所有叶子节点在同层。

查询
由于B树采用左小右大的原则,可以快速定位数据所在的区间,能够快速定位到单点。
插入
- 根据区间正常插入到叶子节点。
- 所在节点元素数超过m-1时,拆分,中间元素提到父节点,左边元素构成一个叶子节点,右边元素构成一个叶子节点。若引起父节点溢出,则递归拆分。
删除
- 根据区间正常定位到关键字,删除。
- 所在节点元素数小于(m-1)/2,从子节点取点补缺,若子节点没有可取点,则从父节点取点补缺,若引起父节点元素数不足,递归此问题。
除了有效减少数据的层数时,B树可以把块大小设置为4k,这样和磁盘块大小相同,可以快速将一个节点的数据全部取出,提高了性能。
B+树
相对于B树,B+树将所有元素都存储到叶子节点,非叶子节点保存的是叶子节点首条数据的引用,用于检索,因此B+树的叶子节点数=关键字数。此外,B+树的每个叶子节点,都包含着指向相邻叶子节点的指针。
B+树的插入和B树几乎一致,只是拆分时不会将元素提到叶子节点,而是将元素的引用提到叶子节点(左节点包含m/2个元素),并递归拆分。
删除时,若删除后节点元素不足,优先从兄弟节点借一个元素,并更新父节点的引用。若兄弟节点不能借出节点,则将两节点合并为同一节点,并更新父节点引用。引起父节点元素不足时,递归操作,当根节点只有一个子节点时则进行降级,引用下移并删除节点。
B+树有以下好处:
- B+树非叶子节点仅存储引用,相对很小,一次性读入内存的关键字多(类似KV分离的好处)。
- B+树所有元素都在叶子节点,查询效率稳定。
- 叶子节点指向相邻兄弟节点,可以快速scan。
B*树
B树在B+树基础上,将非叶子节点也加上指向兄弟节点的指针,并定义非叶子节点关键字个数至少为(2/3)m,进而获取了更高的空间利用率。
常见问题:MySQL/B+树的更多相关文章
- MySQL知识树-查询语句
在日常的web应用开发过程中,一般会涉及到数据库方面的操作,其中查询又是占绝大部分的.我们不仅要会写查询,最好能系统的学习下与查询相关的知识点,这篇随笔我们就来一起看看MySQL查询知识相关的树是什么 ...
- MySQL实现树状所有子节点查询的方法
本文实例讲述了MySQL实现树状所有子节点查询的方法.分享给大家供大家参考,具体如下: 在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方 ...
- MySQL B+树索引和哈希索引的区别
导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BT ...
- MySQL递归查询树状表的子节点、父节点具体实现
mysql版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料,写了两个sql存储过程,子节点查询算 ...
- 字符串的公共前缀对Mysql B+树查询影响回溯分析
年前项目组接微信公众号. 上线之后,跟微信相关的用cid列的查询会话的SQL变慢了几十倍!思考这个问题思考了非常久.从出现以来一直是我心头的一个结.cid这一列是建了索引的,普通的cid列更新 ...
- MySQL B+树索引和哈希索引的区别(转 JD二面)
导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BTRE ...
- 常见问题:MySQL/索引
普通索引 最常用,没有任何限制. 唯一索引 必须唯一,但允许空值,如果是组合索引,列值的组合必须唯一. 组合索引 由于MySQL查询时,只能使用一个索引,因此建立组合索引在组合查询的场景下更加有效.组 ...
- 常见问题:MySQL/事务隔离
数据库并行产生的问题 A事务撤销时,将B事务更改的数据撤销. A事务提交时,将B事务更改的同行数据覆盖. 脏读:A事务读取到了B事务未提交的数据. 不可重复读:A事务中同查询语句不幂等,读到已更新数据 ...
- MySQL B+树 的插入与删除
一.MySQL Index 的插入 有如下B+树,其高度为2,每页可存放4条记录,扇出为5.所有记录都在叶子节点上, 并且是顺序存放,如果用户从最左边的叶子节点开始顺序遍历,可以得到所有简直的顺序 排 ...
随机推荐
- Ubuntu 系统安装教程
- 关于size
关于size它确实可以帮人算内存 但是: 在不会用到整个数组(尤其是在状压的时候) 不要用它,它只能算你申请了多少内存,但算不了会用多少!!! and 有人能告诉我,交题前不好好看看交的哪份代码是什么 ...
- leetcode解题报告(28):Remove Linked List Elements
描述 Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 ...
- [SCOI2016]妖怪
嘟嘟嘟 离NOI最后一周,把自己容易忘的知识点和板子复习一下. (刚答完loj的笔试模拟,感觉上不了90--) update:哦,我89-- 先把式子写出来,每一个妖怪的战斗力\(S(i) = A + ...
- codevs:1792分解质因数:编写一个把整数N分解为质因数乘积的程序。
#include<iostream>#include<cstdio>using namespace std;int main(){ int i=2,n; scanf(" ...
- github上项目的目录结构说明
build 构建脚本 dist 编译出来的发布版 docs 文档 examples 示例文件 src 源码 test 测试脚本 .babelrc Babel 交叉编译的配置 .eslintrc ESL ...
- php 运算符的优先级
由上到下,依次递减,同行优先级相同. 结合方向 运算符 附加信息 无 clone new clone 和 new 左 [ array() 右 ** 算术运算符 右 ++ -- ~ (int) (flo ...
- CF1214题解
D 因为可以用贡献2把起点终点堵掉,所以答案为0/1/2 0/2简单 1:方格可以理解为分层图,考虑每个能到达终点,起点能到达其的点,标记一下,对角线如果仅存在1则为必经之路 E \(d_i\le n ...
- vue后台_纯前端实现excel导出/csv导出
之前的文件下载功能一般是由前后端配合实现,由于项目需要,纯前端实现了一把excel的导出功能: 一.excel导出 1.安装依赖库 xlsx:这是一个功能强大的excel处理库,但是上手难度也很大,还 ...
- elasticsearch x-pack license过期
1.注册一个新的license,每一项都要填写,每次可以使用一年,一年到期后再来注册一个新的 2.更新license (官方文档:https://www.elastic.co/guide/en/x-p ...