哪些数据库是行存储?哪些是列存储?有什么区别?( 二 )


针对这种需求,一些列存储使用隐式标识符(虚拟ID),并使用该值的位置(换句话说,其偏移量)将其映射回相关值 。
在过去几年中,可能由于对不断增长的数据集运行复杂分析查询的需求不断增长,我们看到了许多新的面向列的文件格式,如Apache Parquet、Apache ORC、RCFile,以及面向列的存储,如Apache Kudu、ClickHouse,以及许多其他列式数据存储组件 。

哪些数据库是行存储?哪些是列存储?有什么区别?

文章插图
 
03 区别与优化认为行存储和列存储之间的区别仅在于数据的存储方式有所不同,这是不充分的 。选择数据布局只是列式存储所针对的一系列可能的优化的步骤之一 。
在一次读取中,从同一列中读取多个值可以显著提高缓存利用率和计算效率 。在现代CPU上,向量化指令可以使单条CPU指令一次处理多个数据点 。
另外,将具有相同数据类型的值存储在一起(例如,数字与数字在一起,字符串与字符串在一起)可以提高压缩率 。我们可以根据不同的数据类型使用不同的压缩算法,并为每种情况选择最有效的压缩方法 。
要决定是使用面向列还是面向行的存储,你需要了解访问模式 。如果所读取的记录中的大多数或所有列都是需要的,并且工作负载主要由单条记录查询和范围扫描组成,则面向行的存储布局可能产生更好的结果 。如果扫描跨越多行,或者在列的子集上进行计算聚合,则值得考虑使用面向列的存储布局 。
04 宽列式存储面向列的数据库不应与宽列式存储(如BigTable或HBase)相混淆 。在这些数据库中,数据表示为多维映射,列被分组为列族(通常存储相同类型的数据),并且在每个列族中,数据被逐行存储 。此布局最适合存储由一个键或一组键来检索的数据 。
BigTable论文中的一个典型示例是WebTable 。一个WebTable存储着一个带有某个时间戳、包含如下信息的快照:网页内容、属性以及它们之间的关系 。
页面由反向URL所标识,并且所有属性(如页面内容和锚,锚表示页面之间的链接)由生成这些快照的时间戳来标识 。简而言之,它可以表示为一个嵌套的映射,如图1-3所示 。
哪些数据库是行存储?哪些是列存储?有什么区别?

文章插图
▲图1-3:WebTable的概念性结构
数据存储在具有层次索引的多维排序映射中:我们可以通过特定网页的反向URL来定位与该网页相关的数据,也可以通过时间戳来定位该网页的内容或锚 。每一行都按其行键进行索引 。
在列族中,相关列被分组在一起(在本例中为contents和anchor),这些列族分别存储在磁盘上 。列族中的每个列都由列键标识,该键是列族名称和限定符(在本例中为html,cnnsi.com,my.look.ca)的组合 。
列族可以按照时间戳存储多个版本的数据 。这种布局使得我们可以快速定位更高层的条目(在本例中为Web页面)及其参数(不同版本的内容和指向其他页面的链接) 。
理解宽列式存储的概念表示是有用的,而它们的物理布局也有所不同 。列族的数据布局示意图如图1-4所示:列族被单独存储,但在每个列族中,属于同一键的数据被存储在一起 。
哪些数据库是行存储?哪些是列存储?有什么区别?

文章插图
▲图1-4:WebTable的物理结构
关于作者:Alex Petrov是一位数据基础架构工程师,数据库和存储系统的狂热爱好者,Apache Cassandra 提交者和PMC成员,精通存储、分布式系统和算法 。
本文摘编自《数据库系统内幕》,经出版方授权发布 。




推荐阅读