如何利用批量写入代替多次随机写入?

简介: LSM树通过延迟写入优化磁盘I/O:数据先写入内存中的C0树,达到阈值后批量以块为单位写入磁盘的C1树。C1树采用B+树结构且叶子节点全满,无需预留空间,提升写入效率,适用于高并发写场景。(239字符)

刚才我们提到 B+ 树随机写入慢的问题,对于这个问题,我们现在来思考一下优化想法。操作系统对 磁盘的 读写是以块为单位 的,我们能否以块为单位写入,而不是每次插入一个数据都要随机写入磁盘呢?这样是不是就可以大幅度减少写入操作了呢?

LSM 树就是根据这个思路设计了这样一个机制:当数据写入时,延迟写磁盘,将数据先存放在内存中的树里,进行常规的存储和查询。当内存中的树持续变大达到阈值时,再批量地以块为单位写入磁盘的树中。因此,LSM 树至少需要由两棵树组成,一棵是存储在内存中较小的 C0 树,另一棵是存储在磁盘中较大的 C1 树。简单起见,接下来我们就假设只有 C0 树和 C1 树。

LSM 树由至少 2 部分组成:内存的 C0 树和磁盘的 C1 树
C1 树存储在磁盘中,因此我们可以直接使用 B+ 树来生成。那对于全部存储在内存中的 C0 树,我们该如何生成呢?在上一讲的重点回顾中我们分析过,在数据都能加载在内存中的时候,B+ 树并不是最合适的选择,它的效率并不会更高。因此,C0 树我们可以选择其他的数据结构来实现,比如平衡二叉树甚至跳表等。但是为了让你更简单、清晰地理解 LSM 树的核心理念,我们可以假设 C0 树也是一棵 B+ 树。

那现在 C0 树和 C1 树就都是 B+ 树生成的了,但是相比于普通 B+ 树生成的 C0 树,C1 树有一个特点:所有的叶子节点都是满的。为什么会这样呢?原因就是,C1 树不需要支持随机写入了,我们完全可以等内存中的数据写满一个叶子节点之后,再批量写入磁盘。因此,每个叶子节点都是满的,不需要预留空位来支持新数据的随机写入。

相关文章
|
11月前
|
编解码 算法 前端开发
java后端开发学习路线+避坑指南
java后端开发学习路线+避坑指南
|
11月前
|
存储 索引
如何使用「全量索引结合增量索引」方案?
采用“全量索引+增量索引”方案可高效处理大规模数据更新。系统周期生成不可变的全量索引,提升检索性能;实时新增数据则构建内存中的增量索引,支持快速写入。查询时合并两者结果,并通过删除列表标记已删数据,避免脏数据返回。结合Double Buffer机制,还可实现无锁访问,显著提升系统并发能力与检索效率。(238字)
|
11月前
什么是局部敏感哈希?
局部敏感哈希(LSH)是一种将高维数据映射为低维编码的技术,使相似数据更可能生成相近或相同的哈希值。不同于传统哈希对微小变化敏感,LSH通过随机超平面划分空间,使邻近点在多个划分中大概率落入同侧,从而获得相似哈希码。常用海明距离衡量哈希值相似性,适用于近似最近邻搜索与大规模文本去重等场景。
|
11月前
|
负载均衡 算法 网络协议
负载均衡:节点负载差距这么大,为什么收到的流量还一样?
本文讲解RPC框架中的负载均衡机制,对比传统Web负载均衡,阐述其由调用端自主选择节点的优势。针对业务提出“智能调控流量”需求,提出自适应负载均衡方案:通过收集服务节点的CPU、内存、响应耗时等指标进行打分,动态调整节点权重,结合随机权重算法实现流量合理分配,提升系统稳定性和可用性。
|
11月前
|
机器学习/深度学习 搜索推荐 算法
推荐引擎:没有搜索词,「头条」怎么找到你感兴趣的文章?
资讯类App通过“下拉刷新”精准推荐内容,背后依赖推荐引擎的检索技术。它基于用户行为数据构建用户画像与文章画像,结合协同过滤、内容召回等算法,实现个性化推荐,并通过多路召回与分层排序提升效率与准确性。
|
11月前
|
存储
LSM 树是如何检索的?
LSM树检索先查内存中的C0树,命中则直接返回;未命中再查磁盘C1树。为避免返回过期数据,删除操作会在C0树中标记key为“已删除”,查询时遇此标记即返回失败,并在滚动归并时批量清理C1树中对应数据,实现高效、延迟删除。
|
11月前
|
Docker 容器
Dockerfile
Dockerfile是构建Docker镜像的脚本文件,包含一系列指令,每条指令创建一个镜像层。编写时需用大写指令、按序执行,#为注释。通过docker build构建镜像,再用docker run运行容器。构建时,Docker引擎逐条执行指令,提交每一层变更,最终生成新镜像。
|
11月前
|
算法 搜索推荐 索引
签检索:合理使用标签过滤和划分索引空间
广告引擎通过标签优化索引设计:高区分度标签用于倒排索引,低区分度的加入过滤列表,高覆盖维度则用于索引分片。结合树形结构分流、倒排检索与结果过滤,有效缩小检索空间,提升匹配效率。(239字)
|
11月前
|
存储 缓存 自然语言处理
如何使用磁盘上的倒排文件进行检索?
利用倒排文件检索时,优先将词典加载至内存以提升效率。通过哈希表或B+树定位关键词,再读取对应文档列表(posting list)。若其过长,则采用分层索引(如跳表、B+树)按需加载;结合LRU缓存常用数据,减少磁盘IO,提高检索性能。
|
11月前
|
存储 索引
直接进行多次查询会有什么问题?
直接多次查询会增加次数与开销。以GeoHash查找最近加油站为例,逐步扩大范围虽可行,但“逐圈扩展”效率低,查询次数多;“缩短编码”虽快,却需重复二分查找,浪费资源。优化需平衡查询次数与存储成本。