当前位置: 首页 > news >正文

存储引擎技术进化

B-tree

目前支撑着数据库产业的半壁江山。

50 年来不变而且人们还没有改变它的意向

鉴定一个算法的优劣,有一个学派叫 IO复杂度分析 ,简单推演真假便知。

下面就用此法分析下 B-tree(traditional b-tree) 的 IO 复杂度,对读、写 IO 一目了然,真正明白读为什么快,写为什么慢,如何优化。

为了可以愉快的阅读,本文不会做任何公式推导,复杂度分析怎么可能没有公式呢!

读IO分析

这里有一个 3-level 的 B-tree,每个方块代表一个 page,数字代表 page ID。

上图 B-tree 结构是 内存 的一个表现形式,如果我们要读取的记录在 leaf-8上,read-path 如蓝色箭头所示:

root-9 –> branch-6 –> leaf-8 根-9 ->分支-6 ->叶-8

下图是 B-tree 在 磁盘 上的存储形式,meta page 是起点:

这样读取的随机 IO (假设内存里没有 page 缓存且 page 存储是随机的)总数就是(蓝色箭头):

1(meta-10)IO + 1(root-9)IO + 1(branch-6)IO + 1(leaf-8)IO = 4次 IO,这里忽略一直缓存的 meta 和 root,就是 2  次随机 IO。

如果磁盘 seek 是 1ms,读取延迟就是 2ms

通过推演就会发现,B-tree 是一种读优化(Read-Optimized)的数据结构,无论 LSM-tree 还是 Fractal-tree 等在读上只能比它慢,因为读放大(Read Amplification)问题。

存储引擎算法可谓日新月异,但是大部分都是在跟写优化(Write-Optimized)做斗争,那怕是一个常数项的优化那就是突破,自从 Fractal-tree 突破后再无来者了!

写IO分析

现在写一条记录到 leaf-8。

可以发现,每次写都需要先读取一遍,如上图蓝色路径所示。

假设这次写入导致 root, branch 都发生了变化,这种 in-place 的更新反映到磁盘上就是:

基本是 2  次读 IO和写 2  次写 IO+WAL fsync,粗略为 4  次随机 IO。

通过分析发现,B-tree 对写操作不太友好,随机 IO 次数较多,而且 in-place 更新必须增加一个 page 级的 WAL 保证失败回滚,简直是要命。

Write-Optimized B-tree 写优化B树

说到写优化,在机械盘的年代,大家的方向基本是把随机 IO 转换为顺序 IO,充分发挥磁盘的机械优势,于是出现一种 Append-only B-tree:

更新生成新的 page(蓝色)

page 回写磁盘时 append only 到文件末尾

无需 page WAL,数据不 overwrite,有写放大(Write Amplification)问题,需要做空洞重利用机制

Append-only B-tree 节省了回写时的 2 次随机 IO,转换为常数级(constant)的1次顺序 IO,写性能大幅提升,总结起来就是:

随机变顺序,空间换时间

LSM-tree, Fractal-tree 等写优化算法的核心思想也是这个,只不过其实现机制不同。

LSM-trees lsm树

随着 LevelDB 的问世,LSM-tree 逐渐被大家所熟知。

LSM-tree 更像一种思想,模糊了 B-tree 里 tree 的严肃性,通过文件组织成一个更加松散的 tree。

rockdb应用:

写入

先写入内存的 C0

后台线程根据规则(Leveled/Sized)进行 merge,C0 –> C1, C1 –> C2 … CL

写入 C0 即可返回,IO 放到后台的 Merge 过程

每次 Merge 是硬伤,动作大就抖,动作小性能不好,每次 Merge 的数据流向不明确

写放大问题

读取

读取 C0

读取 C1 .. CL 读取 C1 . CL

合并记录返回

读放大问题

Fractal-tree 分形树

终于发展到了“终极”优化(目前最先进的索引算法,本篇文章参考的是T okuDB 的 Contributor的文章,可能有点武断,个人想法没有最好的算法,只有最适合的算法,有时遍历也是最好的方案 ),Fractal-tree。

它是在 Append-only B-tree 的基础上,对每个 branch 节点增加了一个 message buffer 作为缓冲,可以看做是 LSM-tree 和 Append-only B-tree 完美合体。

相对于 LSM-tree 它的优势非常明显:

Merge 更加有序,数据流向非常分明,消除了 Merge 的抖动问题,大家一直寻找的 compaction 防抖方案一直存在的!

这个高科技目前只有 TokuDB  在使用,这个算法可以开篇新介,这里不做累述,感兴趣的可以参考原型实现 nessDB 

相关文章:

存储引擎技术进化

B-tree 目前支撑着数据库产业的半壁江山。 50 年来不变而且人们还没有改变它的意向 鉴定一个算法的优劣,有一个学派叫 IO复杂度分析 ,简单推演真假便知。 下面就用此法分析下 B-tree(traditional b-tree) 的 IO 复杂度,对读、写 IO 一目了…...

CentOS 9 Stream 上安装 Maven

CentOS 9 Stream 上安装 Maven 在 CentOS 9 Stream 上安装 Maven,可以按照以下步骤进行: 更新系统软件包: sudo dnf update安装 Maven: CentOS 9 Stream 默认的包管理器中已经包含 Maven,你可以直接安装: s…...

强势改进!TCN-Transformer时间序列预测

强势改进!TCN-Transformer时间序列预测 目录 强势改进!TCN-Transformer时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现TCN-Transformer时间序列预测; 2.运行环境为Matlab2023b; 3.单个变量时间序…...

MyBatis的不同参数传递封装

MyBatis参数传递 传参方式 1. 使用 #{} 占位符 这是 MyBatis 中最常用的参数传递方式。它将参数直接替换到 SQL 语句中的占位符位置。 单个参数&#xff1a; <select id"selectUserById" resultType"User">SELECT * FROM users WHERE id #{id}…...

kotlin 协程方法总结

Kotlin 协程是一套强大的异步编程工具&#xff0c;以下是对 Kotlin 协程常用方法的总结&#xff1a; 1. 协程构建器 launch: 启动一个新的协程&#xff0c;不阻塞当前线程&#xff0c;返回一个 Job 对象。 GlobalScope.launch {// 协程体}async: 启动一个新的协程并返回一个…...

脉冲当量计算方法

脉冲的概念&#xff1a; 脉冲当量是指控制器输出一个定位控制脉冲时&#xff0c;所产生的定位控制移动的位移。在直线运动中&#xff0c;它表示移动的距离&#xff1b;在圆周运动中&#xff0c;它表示转动的角度。简而言之&#xff0c;脉冲当量就是电机接收一个脉冲信号后能够移…...

TongWeb7.0.E.6_P11嵌入式版本使用指引(by lqw)

文章目录 声明相关概念手册的使用示范工程安装工程介质 安装前准备示范工程参考&#xff08;spring-boot-helloWorld-2.x&#xff09;示范参考 声明 1.本文参考001_TongWeb_V7.0嵌入式版_JavaEE标准容器用户指南_70E6_P11A01.pdf&#xff0c;实际以最新更新的手册为准。 2.本文…...

Node.js:Express 服务 路由

Node.js&#xff1a;Express 服务 & 路由 创建服务处理请求req对象 静态资源托管托管多个资源挂载路径前缀 路由模块化 Express是Node.js上的一个第三方框架&#xff0c;可以快速开发一个web框架。本质是一个包&#xff0c;可以通过npm直接下载。 创建服务 Express创建一…...

C++之多态(上)

C之多态 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主…...

PySpark单机模式安装教程

目录 1. 环境准备 1.1 安装要求 1.2 检查Python和Java环境 2. 下载并解压Spark 2.1 下载Spark 2.2 解压安装包 3. 配置环境变量 4. 配置Spark 5. 启动Spark Shell 6. 运行测试 7. 关闭Spark Shell 8. 常见问题 8.1 兼容性问题 8.2 环境变量配置 总结 1. 环境准备…...

DEVOPS: 认证与调度

概述 不知道大家有没有意识到一个现实&#xff0c;就是大部分时候&#xff0c;我们已经不像以前一样通过命令行&#xff0c;或者可视窗口来使用一个系统了现在我们上微博、或者网购&#xff0c;操作的其实不是眼前这台设备&#xff0c;而是一个又一个集群 通常&#xff0c;这样…...

ICPC区域赛成都站【赛后回顾+总结】

传送门 前言赛后总结赛后回顾赛后感悟 前言 首先&#xff0c;这是本人本赛季第一场XCPC区域赛&#xff0c;也是本人算竞生涯中第一场XCPC区域赛&#xff08;之前只打过邀请赛和省赛&#xff09;。 赛后总结 然后赛后总结一下&#xff1a;我队天崩开局&#xff0c;我队出师不利…...

保险大模型革新:全面自动化倒计时

摘 要 大模型于保险业不仅是一个技术升级的过程&#xff0c;更是一种商业模式的变革 未来将会是一切都连接着AI的世界——科技杂志《连线》创始主编凯文凯利&#xff08;KevinKelly&#xff09;曾在《5000天后的世界》中预测。 ChatGPT催生大模型热潮已将近两年&#xff0c;…...

《使用Gin框架构建分布式应用》阅读笔记:p212-p233

《用Gin框架构建分布式应用》学习第12天&#xff0c;p212-p233总结&#xff0c;总22页。 一、技术总结 1.JavaScript知识点 (1)class、method (2)function, arrow function, (3)fetch() (4)Promise, then() 2.bootstrap 第5章主要涉及前端技术的运用&#xff0c;作为后…...

点云聚类学习 KMeans/DBSCAN

点云聚类学习--KMeans/DBSCAN OverviewKMeansDBSCAN简单对比 Overview 最近做的东西会处理一些Lidar的点云数据&#xff0c;虽然之前在看Autoware的时候有了解一些聚类的基本原理和实现&#xff0c;但还是稍微再学习一下聚类方法吧&#xff0c;这里就简单记录一下&#xff08;…...

反悔贪心

Problem - C - Codeforces&#xff08;初识反悔贪心&#xff09; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; #include <bits/stdc.h> #define fi first #define se secondusing namespace std; typedef pair<int,int> PII;string a, b, ans; bool vis…...

汽车软件融合分析

随着汽车智能化、互联化的不断发展&#xff0c;软件在汽车中的重要性日益彰显。从硬件定义汽车&#xff0c;到软件定义汽车&#xff0c;再到AI定义汽车&#xff0c;汽车产业的变革正在加速进行。在这一变革中&#xff0c;软件融合成为了一个重要的趋势。本文将从多个角度对汽车…...

机器人和智能的进化速度远超预期-ROS-AI-

危机 通常&#xff0c;有危险也有机遇才称之为危机。 从2020年启动转型自救&#xff0c;到2021年发现危险迫在眉睫&#xff0c;直到2024年也没有找到自己满意的出路。 共识 中产阶级知识分子共有的特性和一致的推断。 200年前的推断&#xff0c;在如今得到了验证。 机器人…...

5天学习RAG路线图,你信吗?

RAG是"Retrieval Augmented Generation"的缩写&#xff0c;让我们来拆解这个术语&#xff0c;了解RAG的本质&#xff1a; R -> Retrieval&#xff08;检索&#xff09; A -> Augmented&#xff08;增强&#xff09; G -> Generation&#xff08;生成&…...

JIME智创:抖音创作者的AI绘画与视频生成创作神器

在短视频和社交内容创作的时代&#xff0c;创意和速度成了成功的关键。无论是视频博主、图文创作者还是品牌推广人&#xff0c;他们都面临着如何快速生成高质量图片与视频素材的挑战。JIME智创正是针对这一需求推出的AI创作工具&#xff0c;专为抖音的图文和视频创作者设计&…...

word简历模板(含范文),免费下载

word简历模板导言 在竞争激烈的求职市场中&#xff0c;一份专业、个性化的简历是叩开理想企业大门的关键。简历不仅是个人经历的罗列&#xff0c;更是能力、潜力与职业规划的集中体现。然而&#xff0c;许多求职者因缺乏经验或模板参考&#xff0c;难以突出自身优势&#xff0…...

提升Telegraf性能:未使用方法接收器的代码优化实战指南

提升Telegraf性能&#xff1a;未使用方法接收器的代码优化实战指南 在Go语言开发中&#xff0c;方法接收器&#xff08;Method Receiver&#xff09;是连接函数与结构体的重要桥梁&#xff0c;但过度使用或不当使用会导致性能损耗和代码冗余。Telegraf作为插件驱动的指标收集代…...

汉码未来提醒大家:为什么说 “保技术” 才是最真的 “保就业”?

市场上很多培训机构宣传 “包就业”“保薪资”&#xff0c;但从行业真实规则来看&#xff0c;如果技术没有真正掌握&#xff0c;任何就业承诺都缺乏实际支撑。原因非常简单&#xff1a;技术面试无法造假。无论简历如何包装&#xff0c;面试官都会通过现场编码、项目细节追问、技…...

电机轴承异响?5分钟教你用振动分析仪定位故障(附实测案例)

电机轴承异响诊断实战&#xff1a;振动分析仪操作全流程解析 轴承异响是工业现场最常见的电机故障之一&#xff0c;但很多维护工程师面对"嗡嗡"声或"咔嗒"响往往无从下手。上周某化工厂的水泵电机就因轴承早期磨损未被及时发现&#xff0c;导致整机报废&am…...

美国低值包裹政策收紧后跨境卖家如何重做运营安全底盘

暗流涌动&#xff1a;跨境物流变局下的生存法则清晨&#xff0c;深圳华强北的某个跨境工作室里&#xff0c;键盘敲击声此起彼伏。屏幕上的订单如往常一样跳动&#xff0c;但运营负责人李薇的眉头却紧锁着。她刚刚收到物流服务商的紧急通知&#xff1a;一批通过“低值货物”通道…...

WarcraftHelper:让魔兽争霸III重获新生的兼容性优化工具

WarcraftHelper&#xff1a;让魔兽争霸III重获新生的兼容性优化工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款免费开源的魔…...

手把手搓FPGA版W5500三合一驱动

FPGA W5500 3合一 驱动 UDP、TCP客户端、TCP服务端三合一&#xff0c;8个SOCKET都可用源代码&#xff0c;SPI时钟80m,无时序问题&#xff0c;上手即用 硬件实测&#xff0c;高速、稳定 verilog编写&#xff0c;纯逻辑实现 这块W5500芯片的驱动在项目里被我折腾了半个月&#xf…...

OpenClaw+Phi-3-mini-128k-instruct低成本方案:自建文本生成流水线

OpenClawPhi-3-mini-128k-instruct低成本方案&#xff1a;自建文本生成流水线 1. 为什么选择本地部署Phi-3-mini-128k-instruct 去年我开始尝试用AI辅助写作时&#xff0c;发现商用API存在两个痛点&#xff1a;一是长文本生成成本高得惊人&#xff0c;二是某些敏感内容会被平…...

MCP23009 I²C GPIO扩展芯片驱动设计与实战

1. MCP23009通用I/O扩展芯片驱动库深度解析与工程实践MCP23009是Microchip公司推出的8位IC总线可编程通用输入/输出&#xff08;GPIO&#xff09;扩展器&#xff0c;专为资源受限的嵌入式系统设计。该芯片通过标准IC接口&#xff08;支持标准模式100 kHz和快速模式400 kHz&…...

实战揭秘:抖音直播弹幕抓取的三大技术突破与完整实现方案

实战揭秘&#xff1a;抖音直播弹幕抓取的三大技术突破与完整实现方案 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取&#xff08;2025最新版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 在直播电商蓬勃发…...