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++ ...
随机推荐
- 阶乘-n!_C语言实现
n! // Code file created by C Code Develop #include "stdio.h" #include "stdlib.h" ...
- 【微信小程序】02 常用标签组件
轮播标签: 轮播图 <swiper> <!-- 轮播项 --> <swiper-item>1</swiper-item> <swiper-item ...
- 学术写作: These authors contributed equally to this work. —— 共同一作
早些年很少看到论文里面有: These authors contributed equally to this work. 不过现在这种方法在论文中出现的还是比较多的,说白了,这种共同一作的声明其实是 ...
- 解锁GraphRag.Net的无限可能:手把手教你集成国产模型和本地模型
在上次的文章中,我们已经详细介绍了GraphRag的基本功能和使用方式.如果你还不熟悉,建议先阅读前面的文章 通过前两篇文章,相信你已经了解到GraphRag.Net目前只支持OpenAI规范的接口, ...
- WhaleStudio 2.6重磅发布!调度模块WhaleScheduler更新78项核心功能
我们很高兴地宣布WhaleStudio 2.6版本的正式发布!新版本中包含了数据调度模块WhaleScheduler和数据集成模块WhaleTunnel的百余项核心功能更新,本文摘选了WhaleSch ...
- bat2exe
https://blog.csdn.net/qq_23452385/article/details/109145151
- 树莓派CM4(三): 定制自己的树莓派镜像
1. 镜像下载 使用树莓派最新的镜像Raspberry Pi OS Lite,内核版本6.6 下载链接 https://downloads.raspberrypi.com/raspios_lite_a ...
- navicat远程连接报错
mysql,2003 can't connect to mysql server on 10038 我们连接远程服务器的mysql,如果出现问题,很大问题会出在服务器的端口和授权问题 # 首先我们通过 ...
- Tesla 开发者 API 指南:BLE 密钥 – 身份验证和车辆命令
注意:本工具只能运行于 mac 或者 linux, win下不支持. 1. 克隆项目到本地 https://github.com/teslamotors/vehicle-command.git 2. ...
- ai识图测试
var code = "9392b629-0d84-43ef-9b0f-34740fb024a6"