【博客720】时序数据库基石:LSM Tree的辅助优化

时序数据库基石:LSM Tree的辅助优化

场景:

LSM Tree其实本质是一种思想,而具体是否需要WAL,内存表用什么有序数据结构来组织,磁盘上的SSTable用什么结构来存放,是否需要布隆过滤器来加快不存在数据的判断等都需要根据业务场景来做特定优化

常见优化:

提示写性能:

  • 假如对写操作的吞吐量比较敏感,可采用日志策略(顺序读写,只追加不修改)来提升写性能。存在问题:数据查找需要倒序扫描,花费很多时间。比如,预写日志WAL,WAL的中心概念是数据文件(存储着表和索引)的修改必须在这些动作被日志记录之后才被写入,即在描述这些改变的日志记录被刷到持久存储以后。如果我们遵循这种过程,我们不需要在每个事务提交时刷写数据页面到磁盘,因为我们知道在发生崩溃时可以使用日志来恢复数据库:任何还没有被应用到数据页面的改变可以根据其日志记录重做(这是前滚恢复,也被称为REDO)。使用WAL可以显著降低磁盘的写次数,因为只有日志文件需要被刷出到磁盘以保证事务被提交,而被事务改变的每一个数据文件则不必被刷出。

  • 压缩:对数据block进行压缩,通过增加占用CPU压缩和解压缩资源来降低数据block磁盘空间占用和读写时间。

  • 批量写:LSM Tree数据写入性能已经很高了,但是批量操作时可以节省网络传输RTT时间。

  • 将数据进行分片(对于网盘尤为合适,其不同文件在不同后端存储集群节点,可以并发写):这样多个分片可以并行写,如果数据路由处理得当,也可以提升数据查询速度。但是增加了维护多个分片数据读写的复杂度。

  • 设计合理的多级索引

  • 在允许情况下关闭自动SSTable合并,在业务量低的时间段强制执行SSTable合并。

提升读性能:

  • 二分查找: 将文件数据有序保存,使用二分查找来完成特定key的查找。分为文件名的二分查找和内容的二分查找

  • 稀疏索引:文件内容如果都是有序的,那么针对文件里的内容的key建立其offset的稀疏索引就可以实现快速文件内容查找

  • 倒排索引:将数据里的关键信息用倒排索引存起来,这样根据倒排索引能知道哪些关键信息在哪些文件,从而定向读取

  • 布隆过滤器:进行查询时,首先检查布隆过滤器。如果布隆过滤器报告数据不存在,则直接返回不存在。否则,按照从新到老的顺序依次查询每个 segment。

  • TableCache:如:LevelDB 不仅提供了Bloom Filter 减少查询过程的磁盘 I/O,还利用缓存将频繁读取的 SSTable 驻留在内存中。因为程序在运行时对内存的访问具有局部性的特点,程序在对某一块的内存请求会非常频繁,如果这一块内存在第一次请求之后就被缓存,那么会大大提升之后的数据读取速度。所以,缓存设计的是否合理有效,在于缓存的命中率高不高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python笔记 - TOML配置文件

TOML(Tom’s Obvious, Minimal Language)是一种配置文件格式,旨在比JSON、YAML等格式更易读、更人性化。它使用简洁的语法,能清晰地表达复杂的结构,同时保留良好的可读性。本文将介绍TOML的基本语法,提供代…

【UE5|水文章】在UMG上显示帧率

参考视频: https://www.youtube.com/watch?vH_NdvImlI68 蓝图:

数值分析笔记(二)函数插值

函数插值 已知函数 f ( x ) f(x) f(x)在区间[a,b]上n1个互异节点 { x i } i 0 n \{{x_i}\}_{i0}^{n} {xi​}i0n​处的函数值 { y i } i 0 n \{{y_i}\}_{i0}^{n} {yi​}i0n​,若函数集合 Φ \Phi Φ中函数 ϕ ( x ) \phi(x) ϕ(x)满足条件 ϕ ( x i ) y i ( i …

Apollo9.0 PNC源码学习之Routing模块

路由:Routing模块根据请求生成导航信息 输入: 地图数据请求,包括:开始和结束位置输出: 路由导航信息 Routing navigation information0 前言 文件结构: modules/routing/ ├── BUILD ├── common ├── conf ├── core ├── cyberfile.xml ├── dag ├── …

数据结构01 栈及其相关问题讲解【C++实现】

栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为“栈顶”,相应的另一端称为“栈底”。 栈及其特点 用一个简单的例子来说,栈就像一个放乒乓球的圆筒,底部是封住的,如果你想…

2024年了,苹果可以通话录音了

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 6月11日凌晨,苹果在WWDC24大会上,密集输出了酝酿多时的AI应用更新。苹果对通话、对话、图…

每日一题44:合作过至少三次的演员和导演

一、每日一题 ---------------------- | Column Name | Type | ---------------------- | actor_id | int | | director_id | int | | timestamp | int | ---------------------- timestamp 是这张表的主键(具有唯一值的列).编写解决方案找出合作过至少三…

力扣 SQL题目

185.部门工资前三高的所有员工 公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。 编写解决方案,找出每个部门中 收入高的员工 。 以 任意顺序 返回结果表。 返回结果格式如下所示。 …

Android studio如何导入项目

打开解压好的安装包 找到build.gradle文件 打开查看gradle版本 下载对应的gradle版本Index of /gradle/(镜像网站) 下载all的对应压缩包 配置gradle的环境变量 新建GRADLE_HOME 将GRADLE_HOME加入到path中 将项目在Android studio中打开进行配置 将gr…

LM339模块电路故障查询

最近的电路测试中出现一个问题,如果不接液晶屏,LM339输入端是高电平,如果接了液晶屏,输入端就是低电平,即使在输入端加了上拉电阻,还是如前面的结论,如果越过LM339,直接和后级电路连接&#xff…

Python爬虫JS逆向进阶课程

这门课程是Python爬虫JS逆向进阶课程,将教授学员如何使用Python爬虫技术和JS逆向技术获取网站数据。学习者将学习如何分析网站的JS代码,破解反爬虫机制,以及如何使用Selenium和PhantomJS等工具进行模拟登录和数据抓取。课程结合实例演练和项目…

ThinkPHP邮件发送配置教程?怎么配置群发?

ThinkPHP邮件发送安全性如何保障?ThinkPHP如何实现? 无论是用户注册后的验证邮件,还是订单处理的通知邮件,都需要一个可靠的邮件发送机制。AokSend将详细介绍如何在ThinkPHP框架中配置邮件发送功能,并带您逐步了解其中…

C#面:C#支持多重继承么?

C#不支持多重继承。在C#中,一个类只能直接继承自一个基类。这是由于C#的设计目标之一是避免多重继承可能带来的复杂性和潜在的问题。 然而,C#提供了接口(interface)的概念来实现类似多重继承的功能。一个类可以实现多个接口&…

Python武器库开发-武器库篇之Mongodb未授权漏洞扫描器(五十六)

Python武器库开发-武器库篇之Mongodb未授权漏洞扫描器(五十六) MongoDB 未授权访问漏洞简介以及危害 MongoDB是一款非常受欢迎的开源NoSQL数据库,广泛应用于各种Web应用和移动应用中。然而,由于默认配置的不当或者管理员的疏忽,导致不少Mon…

维度建模中的事实表设计原则

维度建模是一种数据仓库设计方法,其核心是围绕业务过程建立事实表和维度表。事实表主要存储与业务过程相关的度量数据,而维度表则描述这些度量数据的属性。 以下是设计事实表时需要遵循的几个重要原则,来源于《维度建模》那本书上&#xff0…

Dictionary 字典

文章目录 一、什么是字典1.1 字典的创建方式 一、什么是字典 字典: 用来存储数据,与列表和元组不一样的是,字典以键值对的形式对数据进行存储,也就是 key 和 value。相当于 Java 中的 Map。 注意: 1、 key 的值不可重…

[C++][数据结构][AVL树]详细讲解

目录 1.AVL树的概念2.AVL树节点的定义3. AVL树的插入4.AVL树的旋转1.新节点插入较高左子树的左侧 -- 左左:右单旋2.新节点插入较高右子树的右侧 -- 右右:左单旋3.新节点插入较高左子树的右侧 -- 左右:先左单旋再右单旋4.新节点插入较高右子树…

基于System-Verilog点亮LED灯

文章目录 一、System-Verilog介绍1.1System-Verilog 二、简单的语法介绍2.1接口实例2.2全局声明和语句实例2.3时间单位和精度2.4用户定义的类型2.5 枚举类型 三、流水灯参考 一、System-Verilog介绍 1.1System-Verilog SystemVerilog是一种硬件描述和验证语言(HDV…

书生·浦语大模型实战营第二期作业五

1、开发机创建conda环境: 2、安装第三方库: 3、新建pipeline_transformer.py文件,并运行: 4、运行结果: 5、执行模型: 6、与大模型进行对话: 7、默认占有的显存: 8、--cache-max-en…

一些常用的git指令总结

1、git add 文件名 :该 命令可将该文件的修改添加到暂存区 比如:我刚刚修改了my_test.cpp文件,这时就可以使用git add my_test.cpp. 就将该修改添加到了暂存区。 2、git commit -m "......说明" 就是将当前的修改记录提交到本地…