Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据系统读写权衡的一知半解

数据系统读写权衡的一知半解

作者头像
半吊子全栈工匠
发布于 2021-10-26 07:05:38
发布于 2021-10-26 07:05:38
6740
举报
文章被收录于专栏:喔家ArchiSelf喔家ArchiSelf

在计算机领域,有一个有趣的趋势,往系统中写入数据需要做更多的工作。我们需要对数据进行重新组织、合并、重新建立数据库索引等操作,才能使写入的内容更加有用。如果不这样做,必须实现内容搜索或其他工作来支持未来的数据读取。

数据库中的索引

我关系数据库的索引是个有趣而令人困惑的概念,索引如何在对应用程序透明的情况下优化访问的呢?当然,更新索引意味着另外的磁盘访问,因为 b + 树的索引不适合放在内存中。如果以后读取数据,那么对数据库进行更改的额外工作是值得的。

下一个令人困惑的问题是,应该编制多少索引?是否应该对每一列都建立索引?什么时候应该把一列数据编入索引?我索引越多,读取查询就会变得越快。同时,索引越多,数据更新的速度就越慢。

这是一个常见的权衡方案,快速读意味着慢速写。

行存储与列存储

将高性能更新与行存储联系起来是很自然的,如果按列组织数据的话,因为具有相同值的许多逻辑行在物理上彼此相近,柱状数据库执行查询的速度非常快。但是,更新列存储就不那么容易了。

通常,行存储中的更新单独保存,因为每一行的数据较小,查询会以相对快速的方式检查行。这些查询与更快的列存储的结果相结合,以提供统一的准确结果。新的行存储更新会定期与列存储合并,以创建新的列存储,这可以以类似于 LSM 树中合并的级联方式完成。

当插入到一个列存储区中时,这种重写和整合新数据的负担是一种写入数据放大的形式,在这种形式下,一次写入之后会变成更多的写入。

LSM树的应用

LSM树最早是在1996年提出的,这个想法是将对键值存储的更改作为事务跟踪,并在内存中保留新的值。事务提交时,可以将最近键值对的排序集合写入磁盘中唯一命名的文件。此文件包含已排序的键值对以及文件中键的索引。一旦写入磁盘,新提交的更改不需要保存在内存中。

逐键查找值看起来就像在随机地点找东西时的样子。在一个小房间里线性搜索自己的钱包可能是易于处理,但是当搜索空间在大型酒店里就不那么容易了。为了减少数据读取时的烦琐,LSM 树组织数据的方法是边读边重写。

当从存储引擎新写入一个新文件时,它有一堆键值对。为了便于查找键,这些键与前面编写的文件合并。每个 LSM 树都具有某种形式的扇出,其中较低级别的树保存在更多的文件中。LSM 树的深度取决于扇出、每个文件的大小以及树中键值对的数量。一般来说,大部分存储都位于树的最底层。

因此,在越来越受欢迎的 LSM 结构中,有各种各样的实现选择:

平衡合并

当一个新文件被添加到一个级别时,在循环遍历中选择下一个文件,并将其与下一个级别的文件合并。假设从10个文件中选择一个扇出,会发现文件中的键范围通常涵盖了下面级别中大约10个文件中的键范围。把11个文件合并在一起,一个下降到下个级别,进而得到11个文件。现在,下一级已经被一个文件增加了,所以需要重复并再次合并。

分层合并

在进行合并之前,让一堆文件在每个级别上堆叠起来。假设在每个级别合并之前堆积了10个文件,大大减少了所需的合并数量。

平衡合并有着很大的写入放大, 每次将一个新的键值对写入到级别0,在每个级别上都要重写10到11次,但是读取数据的成本较少。分层合并的写入放大要低得多,因为新文件在合并之前会在每个级别上堆叠起来,所以合并的次数会减少,写入的内容也会减少,但是数据读取所付出的努力要多得多。

索引和搜索

搜索在许多方面都是数据库索引的变体。在数据库中,索引标识一般以行 id 或主键的形式隐藏在数据库中。在关系型数据库系统中,索引更新是通过事务集成的,我们能够看到性能差异。

搜索系统在处理文档方面有些不同。大多数搜索系统在文档发生变更后异步更新搜索索引, 这是与某种形式的ID交织在一起。搜索使得读取文档更加容易。它极大地降低了数据读取时的成本,而创建和合并搜索索引是一项复杂的工作,也是数据写入放大的一种形式。

搜索的索引需要语料库,以找到最近写入或更新的文档。其中每一个都需要有一个标识符,然后需要对其进行处理以定位搜索条件(有时称为 n-grams,https://en.wikipedia.org/wiki/n-gram)。在一个典型的文档中找到这些 n-gram 中的每一个元素都需要发送到包含许多索引元素的索引器。因此,文档标识符与可搜索文档中的每个术语(或 n-gram)相关联,所有这一切都是因为用户进行了写操作或创建了文档。每个文档都需要做大量的工作,而且还有很多很多的文档。

数据的规范化

在关系数据库的世界里,一般要在数据库中保存规范化数据,努力避免更新异常被认为是极其重要的。大多数系统的分布式趋势在增强,其中大多数都有包含其数据的键值对,这些键值对是为了扩展分片使用的。通过将相关数据分组为一个键值对,很容易获取这个值 ,然后发出请求到远程系统。

如果规范化这个大型分片系统中的数据,规范化的值将可能不会在同一个分片上,执行分布式联接比执行集中式联接更加烦人。

为了解决这个问题,一般在数据上加上版本号,方案虽然并不完美,但比起分布式通信或者跨非规范化数据进行大规模更新,它的挑战性要小得多。大规模的分布式系统对一致读的语义施加了很大的压力,这反过来可以被看作是写入放大和读读成本之间的紧张关系。

一句话小结

随着分布式系统的普遍化,数据系统的读写权衡越来越关键,辨认系统中数据读写的使用模式,才能进行设计上的权衡和优化。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 喔家ArchiSelf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
学大数据必懂系列之LSM-Tree
LSM树(Log-Structured-Merge-Tree)(日志结构合并树)是一种能够提升磁盘写入速度的数据结构,它通过将大量的磁盘随机写操作,转换为批量顺序写的方式来得到写入性能的提升。但是同时也牺牲了一部分的读性能
用户5252199
2022/11/22
3.2K0
学大数据必懂系列之LSM-Tree
一文科普 RocksDB 工作原理
会保证每周不低于两篇更新,订阅方式见👉这里,欢迎喜欢我文章的朋友们的订阅支持,激励我产出更多优质文章。 RocksDB 是很多分布式数据库的底层存储,如 TiKV、CRDB、NebulaGraph 等等。在 DataDog 工作的 Artem Krylysov 写了一篇文章(原文链接:https://artem.krylysov.com/blog/2023/04/19/how-rocksdb-works/)来对 RocksDB 做了一个科普,通俗易懂,在这里翻译下分享给大家。
木鸟杂记
2023/09/18
2.9K0
一文科普 RocksDB 工作原理
RocksDB 详解
RocksDB是一个高性能、可扩展、嵌入式、持久化、可靠、易用和可定制的键值存储库。它采用LSM树数据结构,支持高吞吐量的写入和快速的范围查询,可被嵌入到应用程序中,实现持久化存储,支持水平扩展,可以在多台服务器上部署,实现集群化存储,具有高度的可靠性和稳定性,易于使用并可以根据需求进行定制和优化。RocksDB主要使用到了下面知识:
zeekling
2023/10/17
1.5K0
RocksDB 详解
Polardb X-engine 如何服务巨量数据情况下的业务 (翻译)- 2
存储布局,上图显示了x-engine的架构,X-Engine 将每个表分成多个字表,并未每个字表维护一个LSM树,关联快照和索引,x-engine中的每个数据库中包含一个重做日志,每个LSM树由一个位于主存储器中的热数据层和一个位于NVM/SSD/HDD的数据处理层组层,热,温,冷不同的数据的层次在系统中存储在不同访问频率的层次中,热数据包含一个活动的内存表和多个不可变的内存表,他们是跳表,用于存储最近插入的记录,并缓冲热记录的缓存,这里不同访问频度的数据已树桩的结构组织数据,树的每个层级的存储有一个排序的extent序列来组织。extent 包含记录快以及关联的过滤器和索引。我们正在探索机器学习技术与数据访问拼读之间的关系。
AustinDatabases
2024/03/12
1170
Polardb X-engine 如何服务巨量数据情况下的业务 (翻译)- 2
【图文详解】一文全面彻底搞懂HBase、LevelDB、RocksDB等NoSQL背后的存储原理:LSM-tree 日志结构合并树
LSM 树广泛用于数据存储,例如 RocksDB、Apache AsterixDB、Bigtable、HBase、LevelDB、Apache Accumulo、SQLite4、Tarantool、WiredTiger、Apache Cassandra、InfluxDB和ScyllaDB等。
一个会写诗的程序员
2022/11/30
3.6K0
【图文详解】一文全面彻底搞懂HBase、LevelDB、RocksDB等NoSQL背后的存储原理:LSM-tree 日志结构合并树
『数据密集型应用系统设计』读书笔记(三)
一个数据库在最基础的层次上需要完成两件事情: 当你把数据交给数据库时,它应当把数据存储起来;而后当你向数据库要数据时,它应当把数据返回给你。 上一章,我们讨论了数据模型和查询语言,即将数据录入数据库的格式,以及再次返回数据的机制。在本章中我们会从数据库的视角来讨论同样的问题: 数据库如何存储我们提供的数据,以及如何在我们需要时重新找到数据。
1ess
2021/12/20
1.1K0
『数据密集型应用系统设计』读书笔记(三)
DDIA 笔记
本文为 design data-intensive applications 的读书笔记 第一部分:数据系统的基石 第一章:可靠性、可扩展性、可维护性 现今很多应用程序都是 数据密集型(data-intensive) 的,而非 计算密集型(compute- intensive)的。因此CPU很少成为这类应用的瓶颈,更大的问题通常来自数据量、数据复杂 性、以及数据的变更速度。 许多应 用程序都需要: 存储数据,以便自己或其他应用程序之后能再次找到 (数据库(database)) 记住开销昂贵操作的结果,加
王磊-字节跳动
2020/08/08
3K0
从零开始深入理解存储引擎
从两行代码的shell脚本读写文件开始,我们通过逐步解决如下问题得到了一个单机可用的存储引擎(LSM Tree):
腾讯技术工程官方号
2024/08/08
3900
从零开始深入理解存储引擎
《数据密集型型系统设计》LSM-Tree VS BTree
本文为《数据密集型应用系统设计》的读书笔记第一部分第三章的笔记整理,也是个人认为的这本书第一部分最重要的内容。本文将会针对目前数据库系统两个主要阵营进行展开,分别是采用日志型存储结构高速读写的LSM-Tree和面向OLTP的事务数据库BTree两种数据结构对比。
阿东
2022/04/08
5070
TiDB 底层存储结构 LSM 树原理介绍
随着数据量的增大,传统关系型数据库越来越不能满足对于海量数据存储的需求。对于分布式关系型数据库,我们了解其底层存储结构是非常重要的。本文将介绍下分布式关系型数据库 TiDB 所采用的底层存储结构 LSM 树的原理。
肉眼品世界
2023/02/12
8350
TiDB 底层存储结构 LSM 树原理介绍
互联网规模数据库存储引擎的演变
数据库存储引擎的设计对其性能至关重要。几十年来,SQL 和 NoSQL 数据库已经开发出各种技术来优化数据的存储和检索。
云云众生s
2025/01/16
750
互联网规模数据库存储引擎的演变
数据库选型时必知的存储引擎基础
在评估和选型数据库的时候,人们往往将重点放在数据建模的灵活性,一致性保证,线性可伸缩性,容错性,低延迟,高吞吐量和易于管理等方面。但怎么才能评判出这些指标呢?很多人往往会网上一通搜索和看官方文档,再加上自己的“经验”来得出这些指标。
ImportSource
2020/07/27
1.4K0
大数据入门:Hbase存储原理解析
在大数据储存任务当中,针对于具备“5V”特征的大规模数据集,数据存储从传统的关系型数据库开始转向非关系型数据库(NOSQL),而NOSQL数据库当中,Hbase无疑是非常经典的一个作品。今天的大数据入门分享,我们就来讲讲Hbase存储原理。
成都加米谷大数据
2020/12/03
1.2K0
大数据入门:Hbase存储原理解析
《数据密集型应用系统设计》读书笔记(三)
上一章讨论了数据模型与查询语言,即向数据库给出数据时数据的格式以及数据查询的机制,其可以理解为从应用开发者的角度出发讨论了上述两件事情。本章将从「数据库」的角度来进行讨论,即如何存储给出的数据以及如何在要求查询时找到所需的数据,所介绍的存储引擎可以用于传统的关系数据库和大多数 NoSQL 数据库。
口仆
2021/12/24
1.2K0
《数据密集型应用系统设计》读书笔记(三)
别再一知半解啦!索引其实就这么回事!
索引的概念基本所有人都会遇到过,就算没有了解过数据库中的索引,在生活中也不可避免的接触到。比方说书籍的目录,字典的查询页,图书馆的科目检索等等。其实这些都是一种索引,并且所起到的作用大同小异。
五分钟学算法
2020/06/28
6730
别再一知半解啦!索引其实就这么回事!
LSM-tree 基本原理及应用
LSM-tree 在 NoSQL 系统里非常常见,基本已经成为必选方案了。今天介绍一下 LSM-tree 的主要思想,再举一个 LevelDB 的例子。
Apache IoTDB
2020/09/27
9240
LSM-tree 基本原理及应用
LSM 树:数据库、搜索引擎等的首选数据结构
LSM树是Log-Structured-Merge Tree的缩写,是一种巧妙的算法设计,可以帮助我们存储海量数据,而无需永远等待写入。它首先将数据存储在内存中,速度快如闪电。但由于我们无法将所有内容都保存在内存中,因此 LSM 树会定期将数据刷新到磁盘。
shengjk1
2025/05/16
1150
LSM 树:数据库、搜索引擎等的首选数据结构
存储系统中的算法:LSM 树设计原理
我在上篇文章 Apache Pulsar 的架构设计 中介绍了 Pulsar 存算分离的架构,其中 broker 只负责计算,由 BookKeeper 负责底层的存储,我还画了这样一张图说明 BookKeeper 读写分离的设计:
labuladong
2022/12/10
6280
存储系统中的算法:LSM 树设计原理
计算机存储设计理论
不同的数据库存储系统都会设计不同的索引结构来优化查询/写入效率, 在讨论这些结构之前, 我们先从头回顾一下计算机存储的一些设计
leobhao
2024/06/04
3220
计算机存储设计理论
程序员必备的数据库知识:数据存储结构
数据在数据库中的存储方式就是数据存储结构。传统数据库由上到下,可以分为网络接入层、计算引擎层、存储引擎层、系统文件层,数据存储结构就是在存储引擎层,数据库通过存储引擎实现CRUD操作。不同的存储引擎决定了数据库的性能和功能,所以存储引擎层是数据库的核心。另外,在数据库中数据是以表的形式存储,所以存储引擎也可以称为表类型。
NineData
2023/02/03
1.7K0
程序员必备的数据库知识:数据存储结构
相关推荐
学大数据必懂系列之LSM-Tree
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档