RocksDB 的范围查询是如何优化的?

RocksDB系列一:RocksDB基础和入门 1、简介       RocksDB是FaceBook起初作为实验性质开发的一个高效数据库软件,旨在充分实现快存上存储数据的服务能力。RocksDB是一个c++库,可以用来存储keys和values,且keys和values可以是任意的字节流,支持原子的读和写。除此外,RocksDB深度支持各种配置,可以在不同的生产环境(纯内存、Flash、hard disks or HDFS)中调优,支持不同的... 阅读详情

MySQL 的存储引擎除了最常用的是 InnoDB 引擎之外还有一个 MyRocks 引擎也经常会用到,它是基于 RocksDB 开发的一套存储引擎,比 InnoDB 性能要高出 N 倍。

在索引实现上,InnoDB 的索引使用  B+ 树实现,B+ 树的叶子节点上存储了索引的 key,所有的叶子结点使用指针串了起来,非常易于索引的遍历操作。比如下面这个语句(key1 字段加了索引)的范围查询就可以很好的利用这个特性

select key1 from t where key1 > 'abc' and key1 < 'def'

但是 MyRocks 的索引实现不一样,MyRocks 的索引使用 LSM Tree 来实现,通常 LSM Tree 都不支持高效的范围遍历。原因在于 LSM Tree 是多层结构 —— 内存里的 MemTable 和磁盘上的 7 层 SST 文件,范围遍历需要对内存里的多个 MemTable 和这磁盘上的 7 层文件都需要读取后 Merge 在一起才能拿到最终的范围遍历的结果。如果查询范围比较窄,其中 0 层文件可能需要全部读取,其它 6 层通常只需要读取一个文件,因为 0 层文件的多个文件 Key 之间是有重叠的,而其它 6 层中每层的多个文件之间是严格根据 Key 范围切割的。即使对应 SST 文件里面不存在目标范围的 Key,这样的磁盘读取还是不可避免。

我们知道 RocksDB 磁盘上的每个SST 文件里面里面都存了一个布隆过滤器,布隆过滤器的内容通常是缓存(固定)在内存中的。如果布隆过滤器能帮我们提前把查询范围过滤掉,判断出目标 SST 文件是否存在目标查询范围,这样就可以减少磁盘读取了。

但问题是布隆过滤器也是不存在范围查询的能力的,通常也只能判断一下过滤器中是否存在某个 Key。为了解决这个问题,RocksDB 引入了 prefix_extractor ,它可以很好的解决这个难题。那这个 prefix_extractor 又是个什么高深的技术呢?其实也很简单,它就是 prefix bloom filter。

这个「前缀布隆过滤器」 Add 进来的 Key 不再是原来的 Key,而是 Key 的固定长度的前缀,它带来的好处之一是布隆过滤器占用的空间变小了,坏处是误判率也会跟着提高了一点。假设前缀长度是 3,那么把 abcd 这个 Key 加进去后会认为 abce 也在里面,因为它们共享了 abc 这个前缀。这省下来的空间可以用来存储一个附加的数据结构 —— Key 前缀 的有序集合,它里面容纳了所有的 Key 前缀的值。通过这个有序的 Key 前缀集合可以快速判断出目标范围是否存在于当前的 SST 文件中。

和布隆过滤器的数据一样,这个 Key 前缀的有序集合也是缓存(固定)在内存中的。因为单个  SST 文件的 Key 数量是有限的,前缀设置的比较短的话,对应的的前缀数量也会非常少,消耗的内存就可以忽略不计了。

聪明的同学可能想到了,这个前缀的长度取多少比较合适呢?要是用户的索引字段值上自带了前缀字符串,那切割出来的前缀有可能完全一样,这前缀布隆过滤器岂不是要形同虚设么?

Rust中使用RocksDB索引进行高效范围查询的实践指南 本文深入探讨了在Rust中利用RocksDB实现高效范围查询的实践方法。通过分析适合范围查询的索引特点(有序性、可遍历性等),介绍了键的设计原则(字典序、前缀补零等)和迭代器的工程实践。文章详细讲解了RocksDB磁盘跳表实现原理与搜索流程,并提供了从指定范围起点查询的Rust代码示例。最后给出性能优化建议,包括合理设置prefix_extractor、使用Column Family隔离数据以及定期执行compact_range等。这些技术能帮助开发者在处理海量数据时实现高效的范围查询能力。 阅读详情

相关推荐

看图了解RocksDB

它是一个高性能的Key-Value数据库。设计了完善的持久化机制,同时保证性能和安全性。能够良好的支持范围查询,因为K-V记录就是按照Key来排序的。下图为写入的流程:可以看到主要的三个组成部分,内存结构memtable,类似事务日志角色的WAL文件,持久化的SST文件。数据会放到内存结构memtable,一定条件下触发写到到SST文件。写入WAL文件是可选的,用来恢复未写入到磁盘的memtable。下图展示了读取的层次:memtable和SST文件组成数据的全集。之上是缓存层,缓存为提升查询性能做了分片,底层都采用hash查询,不同缓存结构的区别在于热点数据的替换逻辑。访问数据库时,都是访问

RocksDB入门

SSTable(Sorted String Table)是一个通常放在磁盘上的,排序的字符串表, 用来高效存储大量的键值对数据, 同时搭配上优化实现IO操作的高吞吐量.block是SSTable里面存储信息的一个单元,主要由数据区record和restarts组成,

JH_Zhai的博客 887

使用moveit!控制真实机械臂(5)——编写真实机械臂节点中的action服务程序

上一篇文章中,我们简要介绍了ROS中action的基本知识,为了控制真实机械臂,我们已经修改了moveit配置文件,使得moveti启动后具备一个control_msgs::FollowJointTrajectoryAction类型的action客户端,接下来,我们完成该类型action的另一半,编写C++程序来实现action的服务端。由于底层机器人控制程序一般差别都很大,这里展示的只是编程要点...

爱学习的草莓熊 1万+

RocksDB(一):What is RocksDB?

RocksDB是FaceBook起初作为实验性质开发的NOSQL存储系统,旨在充分实现快存上存储数据的服务能力。其设计是基于Google开源的LevelDB。

LANGYUEXIAN的博客 1408

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 397

EEGLAB+ERPLAB实战:从.cnt文件到情绪ERP差异波,一份避坑指南

本文详细介绍了使用EEGLAB和ERPLAB处理Neuroscan的.cnt格式脑电数据的全流程,从数据导入、预处理到情绪ERP差异波生成。重点解决了采样率验证、事件标记检查、重参考选择、滤波策略与ICA组合等实操难题,并提供了情绪图片ERP研究中P1、EPN和LPP成分的分析技巧,帮助研究者避免常见错误,提升数据处理效率。

weixin_26795617的博客 266

rocksdb使用

最近项目需要使用个key-value数据存储,在众多k-v数据库中,选择了rocksdb,原因只有一条,这货自称支持范围查询。 OK,git下载下来,编译,这里说一下,号称支持C++11所以对编译器的版本是有要求的,so,你得看看你的编译器是不是支持C++11.可以编译so和.a两种文件类型,这个跟其他的开源库一个套路,看看说明编译就行了,如果你发现由于Gtest的一些东西编译失败,可以试试编译

q96456的专栏 6686

RT-Thread新手必看:FMT飞控移植中的5个常见坑及解决方案

本文针对RT-Thread新手在移植FMT开源飞控时遇到的5大核心挑战,提供了深度解决方案。内容涵盖SCons构建系统配置、RT-Thread版本API兼容性处理、BSP与设备驱动适配、TOML系统配置解析以及算法模块集成调试,帮助开发者高效避坑,成功完成飞控移植。

gin88的博客 252

查询范围_RocksDB 的范围查询是如何优化的?

MySQL 的存储引擎除了最常用的是 InnoDB 引擎之外还有一个 MyRocks 引擎也经常会用到,它是基于 RocksDB 开发的一套存储引擎,比 InnoDB 性能要高出 N 倍。在索引实现上,InnoDB 的索引使用 B+ 树实现,B+ 树的叶子节点上存储了索引的 key,所有的叶子结点使用指针串了起来,非常易于索引的遍历操作。比如下面这个语句(key1 字段加了索引)的范围...

weixin_36296864的博客 542

网络速度的极致:800G & 1.6T 以太网的突破!

你好,这里是网络技术联盟站。在我们进入数据驱动的世界时,以太网的重要性日益突出。从根本上说,以太网是一种连接计算机的技术,旨在形成一个本地网,通过它,设备可以与其他设备进行通信。然而,随着时间的推移,以太网已经发展成为一种全球的数据通信系统,其速度从初始的10Mbit/s发展到现在的800G,甚至1.6T。这种巨大的进步并不是没有挑战的,但每一次的突破都代表了技术的巨大飞跃。本文将探讨800G和1.6T以太网的创新与挑战。

网络技术联盟站 1773

基于STM32设计的环境检测系统(OneNet)_365

本项目设计并实现了一种基于STM32F103RCT6单片机的环境检测系统,系统集成了多种传感器模块,具备对环境温湿度、烟雾浓度、易燃气体浓度、一氧化碳浓度和整体空气质量的实时检测功能。系统通过1.44寸SPI接口LCD实现本地数据显示,同时配备有源蜂鸣器用于环境异常报警。在数据通信方面,系统利用ESP8266-WIFI模块,采用MQTT协议将各类传感器数据上传至OneNet云平台,并借助其可视化框架实现网页端可视化界面,可通过电脑和手机浏览器远程访问,实现环境数据的远程监控。该系统设计结构简单、功能全面,适

2200

code blocks代码性能分析_布隆过滤器(Bloom Filter)在MyRocks中的使用分析

来源:数据库内核开发作者:网易杭研数据库团队LSM类型的存储引擎查询性能要低于B-tree 类型的存储引擎,RocksDB 有针对性的优化那就是:bloom filter。其实在LevelDB 里就存在bloom filter,但是RocksDB 在LevelDB的基础上又做了优化。本文主要内容包括以下部分:Bloom filter 在RocksDB 的实现MyRocks 如何利用bloom fi...

weixin_39547298的博客 401

水与光的奇妙“切割之舞”:水导激光切割技术探秘

水导激光切割技术的诞生,是材料加工领域不断追求高精度、高质量加工的成果。传统激光切割技术在加工过程中,材料会因瞬间高温而产生热变形、热影响区大以及切割面粗糙等问题,这些弊端在对一些高精度、热敏性材料的加工中尤为突出 ,迫切需要一种新的技术来克服这些难题。水导激光切割技术的起源可以追溯到 20 世纪 80 年代。1986 年,德国公司 Aesculap-Werke AG 首次提出了将水流引入激光切割过程的创新想法,并制造出首代水导激光设备。不过,当时的技术尚处于雏形阶段,仅仅是在光纤出口添加了一小柱水流,激光

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1674

高频使用RocksDB DeleteRange引起的问题及优化

kv存储实践中,范围删除是一个常见需求。比如我们需要删除所有以特定prefix开头的记录。

zyun360的博客 728

Vibe coding 氛围编程:编程就像聊天一样,低代码开发时代来了?

Vibe coding:编程就像聊天一样,低代码开发时代来了!

Code_流苏:在代码中寻诗意,在实践中觅真知 4804

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

rocksdb原理_看图了解RocksDB

编辑推荐:本文来自于oschina,本文主要介绍RocksDB的写入的流程、读取的层次等相关内容。它是一个高性能的Key-Value数据库。设计了完善的持久化机制,同时保证性能和安全性。能够良好的支持范围查询,因为K-V记录就是按照Key来排序的。下图为写入的流程:可以看到主要的三个组成部分,内存结构memtable,类似事务日志角色的WAL文件,持久化的SST文件。数据会放到内存结构memtab...

weixin_39860919的博客 474

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

区块链节点存储选型实战:LevelDB与RocksDB的5个关键性能差异点

本文深入对比了区块链节点存储中LevelDB与RocksDB的5个关键性能差异点,包括写入并发能力、读取性能、资源占用、故障恢复和配置调优。通过实际测试数据和应用案例,帮助开发者在区块链项目中做出更优的存储选型决策,提升系统性能和可靠性。

a1b2c的博客 196

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

检索com类工厂中clsid为的组件失败_布隆过滤器(Bloom Filter)在MyRocks中的使用分析...

本文出自组内小伙伴LSM类型的存储引擎查询性能要低于B-tree 类型的存储引擎,RocksDB 有针对性的优化那就是:bloom filter。其实在LevelDB 里就存在bloom filter,但是RocksDB 在LevelDB的基础上又做了优化。本文主要内容包括以下部分:Bloom filter 在RocksDB 的实现MyRocks 如何利用bloom filter优化查询Bloom...

weixin_39727976的博客 245

对LevelDB的“升级版”存储引擎RocksDB的调研成果

Google的leveldb是个非常优秀的存储引擎。但还是有一些不尽人意的地方,比方leveldb不支持多线程合并。对key范围查找的支持还非常easy,未做优化措施,等等。而Facebook的RocksDB是个更彪悍的引擎。实际上是在LevelDB之上做的改进。在使用方法上与LevelDB非常的相似,两者的对照能够參考以下的參考资料1。 这里之所以要调研rocksdb是由于rocksd...

weixin_30609331的博客 105

PebblesDB -- 阅读笔记及与RocksDB性能对比

PebblesDB论文阅读笔记,并与RocksDB进行性能对比

DariusYoung的博客 1007
上一篇: 让腾讯、字节跳动放弃 Python / C 的 Go 微服务,凭什么?
下一篇: Redis 生涯就此结束
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值