SQL Server – 树结构 (二叉树, 红黑树, B-树, B+树)
前言
很久以前有学习过各种树结构, 但后来真的没有在实际项目中运用到. 毕竟我主要负责的都是写业务代码. 太上层了
但是忘光光还是很可惜的. 所以久久可以复习一下. 记得概念也好, 帮助思考.
参考:
YouTube – How to Create Database Indexes: Databases for Developers: Performance #4 (必看)
YouTube – mysql底层原理-二叉树、红黑树、BTree、B+Tree (必看)
怎样保存资料, 怎样找的快?
如果我们有个 Array, 里面装了 1-100 凌乱的数字,
const numbers = [20, 15, 99, 75, 100, 1, 15, 8, ...]
如果想找出其中一个号, 那么就得 for loop 每一个号码.
日常生活给我们的经验是, 东西乱就找得慢, 要找的快, 那么东西就要存放好好, 有规律.
像这样
const numbers = [
[1, 2, ...50],
[51, 52, ...100]
];
首先要保存的数据要排序. 然后是拆分 (所谓的二分查找). 最外层 for loop 只有 2 个 child array (各负责 50% 数据)
如果发现找的号数在 1-50 那么就 for loop 1-50 的 array 就可以了, 这样就直接过滤掉了另外 50% 的数据.
上面只是一个概念, 我们还可以拆分的更细. 比如 [51-75], [76-100] 以此类推.
二叉树
二叉树就是通过有规则的保存方式来确保找的快的.
它的规则是左小右大.

如果目标是 7, 那么从最上面 8 开始,
7 小于 8 所以肯定在左边, 那么右边的数据 (10, 14, 13) 直接忽视掉. 以此类推
二叉树的问题在于, 它不一定平衡. 如果顺序插入 1-7, 那么它会长这样

所有数据都往右边长, 这完全就不是二叉树了丫.
于是我们需要添加一些规则给它. 在保持左小右大规则的同时又能兼顾平衡. 不要所有数据都往一边靠.
红黑树

红黑树的规则可以确保树支的方向是平均生长的.
每当新节点插入的时候, 为了要满足规则, 树结构就必须做调整. 当然这个调整是有消耗的. 但为了找的时候快, 只能让插入的时候变慢. 这就是 trade-off

B 树
B 树又对红黑进行了优化, 它利用了磁盘预读原理, 加大了树的宽度 (MySQL 16kb, SQL Server 8kb per page), 减少了树的高度.
磁盘每一次读多少是不确定的, 因为系统会缓存, 可能把几次读操作合并一起做, 参考: 磁盘读写与数据库的关系
预读是因为局部性原理, 通常当你需要一个资料, 它附近的资料你也会想要用到. 而且顺着读性能不大, 所以就顺便预读出来了.

B+ 树

对 B 树做了优化, data size 太大, 会导致磁盘块太大, 于是把 data 都移到了最底部, 这样就先查找关键字, 然后才去拿资料. 这也说明为什么索引只能 450 字 (索引就是查找关键字, 在上层, 起到 column data 在底层).
结论
数据库的设计和找字典是一样概念, 上面这些磁盘块, 就好比字典的目录,
比如我找 Derrick 这个字, 一页一页翻肯定很慢, 但是有一个 A-Z 的目录, 里面就 26 个字母.
先把目录读出来, 然后 loop 到 D, 那么就锁定 D 的范围了. 过滤了大部分不相关的字.
所谓的 index 就是目录. 依据不同 column 排序.
p.s 红黑, B 树 抽象都是平衡二叉树, 目的都为了平衡, B-树就是B树来的. 只是因为有一个B+树所以就把原来的叫B-树.
SQL Server – 树结构 (二叉树, 红黑树, B-树, B+树)的更多相关文章
- 吐血整理:二叉树、红黑树、B&B+树超齐全,快速搞定数据结构
前言 没有必要过度关注本文中二叉树的增删改导致的结构改变,规则操作什么的了解一下就好,看不下去就跳过,本文过多的XX树操作图片纯粹是为了作为规则记录,该文章主要目的是增强下个人对各种常用XX树的设计及 ...
- 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树
http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...
- [BinaryTree] AVL树、红黑树、B/B+树和Trie树的比较
转自:AVL树.红黑树.B/B+树和Trie树的比较 AVL树 最早的平衡二叉树之一.AVL是一种高度平衡的二叉树,所以通常的结果是,维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应 ...
- 为什么HashMap使用红黑树而不使用AVL树
为什么HashMap使用红黑树而不使用AVL树? 红黑树适用于大量插入和删除:因为它是非严格的平衡树:只要从根节点到叶子节点的最长路径不超过最短路径的2倍,就不用进行平衡调节 AVL 树是严格的平衡树 ...
- 二叉树,平衡树,红黑树,B~/B+树汇总
二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操作的时候,都不需要彻底重建原始的索引树 ...
- 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树
1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...
- 数据结构(5) 第五天 快速排序、归并排序、堆排序、高级数据结构介绍:平衡二叉树、红黑树、B/B+树
01 上次课程回顾 希尔排序 又叫减少增量排序 increasement = increasement / 3 + 1 02 快速排序思想 思想: 分治法 + 挖坑填数 分治法: 大问题分解成各个小问 ...
- 红黑树以及与AVL树的区别
http://blog.csdn.net/zwan0518/article/details/12219055 http://blog.csdn.net/v_july_v/article/details ...
- (js描述的)数据结构[树结构之红黑树](13)
1.二叉送搜索树的缺点: 2.红黑树难度: 3.红黑树五大规则: 4.红黑树五大规则的作用: 5.红黑树二大变换: 1)变色 2)旋转 6.红黑树的插入五种变换情况: 先声明--------插入的数据 ...
- B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树
B B+运用在file system database这类持续存储结构,同样能保持lon(n)的插入与查询,也需要额外的平衡调节.像mysql的数据库定义是可以指定B+ 索引还是hash索引. C++ ...
随机推荐
- Linux安全启动及Machine Owner Key(UEFI BIOS MBR GPT GRUB)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 无 前言 只要装过各种系统的人都或多或少会接触 ...
- 为团队配置Linux环境,简单高效的项目共享方案
前言 最近好久没写博客了,事情太多了,我还搞了个新的好玩的项目,等后续做得差不多了来写篇文章介绍一下. 在我们目前的AI项目中,团队需要共同使用一台GPU服务器来做模型训练和数据处理.为了让每个团队成 ...
- 【Vue】单据打印功能
一.打印组件 需要选定区域进行打印,使用vue-print组件 组件安装 npm install vue-print-nb --save 在项目的Main.js中引入(全局注册): import Pr ...
- Http、Https简介和Session、token的请求流程
Http Http (超文本输出协议) 是一种分布式.协作式和超媒体信息系统的应用层协议,它通常运行在TCP之上,因特网应用最广泛的便是Http协议,所有www都遵循这个标准.主要用于Web 浏览器与 ...
- 树莓派3b+使用官方屏幕后倒置问题——屏幕倒置
树莓派3b+的屏幕本身就是倒置的,因此为了使树莓派在官方屏幕下能显示正常的屏幕画面因此需要通过设置把树莓派的官方屏幕的输出倒置一下,这样树莓派的官方屏幕的输出就是正常的了. 解决方法:(源自:http ...
- 普通用户权限运行docker
docker安装后默认权限是管理员,在Ubuntu系统中需要使用sudo命令,但是很多时候docker的拉取操作都是写在脚步里面的,因此执行的时候十分的难搞,如果给脚本sudo权限后那么整个的环境路径 ...
- python语言:通过对100个常用网站进行网络连接操作来判断当前的网络情况(是否被断掉)
由于需要判断网络的通信情况,比如判断网络是否掉线,因此想到了一个笨方法,那就是对100个大型网站进行网络连接操作,通过是否连接成功来判断当前的网络是否被断掉. 这里的思路是只要大部分的网站可以连接通那 ...
- DolphinScheduler日志乱码、worker日志太多磁盘报警、版本更新导致不兼容怎么办?
作者 | 刘宇星 本文作者总结了在使用Apache DolphinScheduler过程中遇见过的常见问题及其解决方案,包括日志出现乱码.worker日志太多磁盘报警.版本更新导致不兼容问题等,快来看 ...
- VUE——语法糖
- 开源的 P2P 跨平台传文件应用「GitHub 热点速览」
就在上周,发完那篇文章之后不久,我就有幸获得了 GitHub Models 服务公测的访问权限,所以就体验了一下 Playground 聊天功能. 起初,我以为这是"微软菩萨"降临 ...