定义

关系数据库采用的数据存储有两种方式:行式存储和列式存储(也被称为columnar或C-store)

行式存储

是按记录组织数据的数据库,将与记录相关联的所有数据彼此相邻地保存在内存中。面向行的数据库是组织数据的传统方式,为快速存储数据提供了一些关键优势。它们针对有效地读取和写入行进行了优化。因此又相比列式存储的数据称为写优化的数据库。

常见行式存储的数据库:Postgres、MySQL

列式存储

是按字段组织数据的数据库,将与字段相关联的所有数据彼此相邻地保存在内存中。列式数据库越来越受欢迎,并为查询数据提供了性能优势。它们针对有效地读取和计算列进行了优化。因此相比行式存储被称为读优化的数据库。

常见的列式存储的数据库:Redshift、BigQuery、Snowflake

市面上也有少许数据库既支持行式存储也支持列式存储的,例如:SAP HANA

行式存储的数据库

传统的数据库管理系统通过这种方式存储数据。它们主要以读取和写入单行数据为主要功能导向,这也决定了采用行存储架构。

在行式存储的数据库中,数据是逐行存储的,这样后一行的第一列将紧挨前一行的最后一列。

例如,让我们以Friends数据为例:

Name City Age
Matt Log 27
Dave San 30
Tim Oak 33

这些数据将按行存储在行式数据库中的磁盘上,如下所示:

Matt Log 27 Dave San 30 Tim Oak 33

这允许数据库快速写入一行,因为只需要将新一行的记录直接添加到数据的末尾。

行式数据库的写入

例如原有的数据为:

Matt Log 27 Dave San 30 Tim Oak 33

如果我们要新增一条新纪录

Jen Van 30

我们可以将它附加到当前数据的末尾:

Matt Log 27 Dave San 30 Tim Oak 33 Jen Van 30

行式数据库通常用于在线事务处理(OLTP)风格的应用程序,因为它们可以很好的进行数据库的写入。但是,数据库的另一个主要用途是分析其中的数据。这些在线分析处理(OLAP)用例需要一个能够支持数据的即席查询的数据库,在这个场景中,行式数据库比较慢。

行式数据库的读取

面向行的数据库在检索一行或一组行时速度很快,但是在执行聚合时,它会将额外的数据(列)带入内存,这比仅选择要执行聚合的列要慢。此外,面向行的数据库可能需要访问的磁盘数量通常更大。

额外数据进入内存

假设我们想从Friends数据中获取年龄总和。为此,我们需要将所有九个数据块加载到内存中,然后提取相关数据进行聚合。

Matt Log 27 Dave San 30 Tim Oak 33

这浪费了很多的计算时间。

访问的磁盘数量

让我们假设一个磁盘只能容纳足够的数据字节,以便在每个磁盘上存储三列。在面向行的数据库中,上表将存储为:

DISK1:

Name City Age
Matt Log 27

DISK2:

Name City Age
Dave San 30

DISK3:

Name City Age
Tim Oak 33

为了得到所有人年龄的总和,计算机需要查看所有三个磁盘以及每个磁盘中的所有三列才能进行此查询。
因此我们可以看到,虽然向面向行的数据库中添加数据既快速又简单,但从中获取数据可能需要使用额外的内存和访问多个磁盘。

列式存储的数据库

为了对大量数据进行分析,因此有了数据仓库。这类型的数据库是针对读取进行优化的。在列式存储的数据库中,数据的存储方式是使列的前一行与同一列中的后一行相邻。让我们再次查看相同的数据集,看看它如何存储在面向列的数据库中。

Name City Age
Matt Log 27
Dave San 30
Tim Oak 33

这些数据将按列存储在列式数据库中的磁盘上,如下所示:

Matt Dave Tim Log San Oak 27 30 33

列式数据库的写入

如果我们要添加一条新记录:

Jen Van 30

我们必须在数据中查找以将每一列插入到它应该在的位置。

Matt Dave Tim Jen Log San Oak Van 27 30 33 30

如果数据存储在单个磁盘上,它将与面向行的数据库一样存在额外的内存问题,因为它需要将所有内容都放入内存。但是,当存储在单独的磁盘上时,面向列的数据库将具有显著的优势。如果我们将上面的表格放入同样受限的三列数据磁盘中,它们将像这样存储:

Name Name Name
Matt Dave Tim

DISK2:

City City City
Log San Oak

DISK3:

Age Age Age
27 30 33

列式数据库的读取

要获得年龄的总和,计算机只需转到一个磁盘(磁盘 3)并将其中的所有值相加。不需要拉入额外的内存,它访问的磁盘数量最少。
虽然这有点过于简化,但它说明通过按列组织数据,需要访问的磁盘数量将减少,并且必须在内存中保存的额外数据量最小化。这大大提高了计算的整体速度。
当然还有其他优化方法可以让面向列的数据库获得更高的性能。

列存储的优势

更高的数据压缩率

列式数据存储允许高效压缩。特别是如果对列进行了排序,在连续内存中会有相同值的范围,因此可以更有效地使用行程长度压缩算法等压缩方法。

列操作的更高性能

通过列式数据组织,对单个列的操作(例如搜索或聚合)可以实现为对存储在连续内存位置中的数组的循环。这样的操作具有很高的空间局部性并有效地利用了CPU缓存。

此外,高效的数据压缩不仅可以节省内存,还可以提高速度。

消除附加索引

在许多情况下,列式数据存储消除了对额外索引结构的需求,因为在列中存储数据已经像为每列拥有一个内置索引一样工作:内存中列存储的列扫描速度和压缩机制(尤其是字典压缩)已经允许以非常高的性能进行读取操作。在许多情况下,不需要额外的索引结构。消除索引可以减少内存大小,可以提高写入性能,并减少开发工作。但是,这并不意味着 SAP HANA 中根本不使用索引。主键字段总是有一个索引,如果需要,可以创建额外的索引。此外,全文索引用于支持全文搜索。

消除物化聚集体

由于其列扫描速度,列存储可以在运行中以高性能计算大量数据的聚合。在许多情况下,这消除了对物化聚合的需要。消除物化聚合有几个优点。简化数据模型和聚合逻辑,使开发和维护更加高效;它允许更高级别的并发性,因为写入操作不需要排他锁来更新聚合值;它确保聚合值始终是最新的(物化聚合有时仅在预定时间更新)。

并行化

基于列的存储还简化了使用多个处理器内核的并行执行。在列存储中,数据已经垂直分区,这意味着可以轻松并行处理不同列上的操作。

何时使用行式存储和列式存储

列式存储

  • 计算通常在单个或少量列上执行。
  • 根据多个列的值搜索该表。
  • 该表具有大量列。
  • 表行数较多,需要进行列式操作(聚合、扫描等)
  • 可以实现高压缩率,因为大多数列仅包含几个不同的值(与行数相比)。

行式存储

  • 应用程序一次只需要处理一条记录(单条记录的多次选择和/或更新)。
  • 应用程序通常需要访问完整的记录。
  • 这些列主要包含不同的值,因此压缩率会很低。
  • 既不需要聚合也不需要快速搜索。
  • 该表的行数很少(例如,配置表)。

这篇文档主要分析了行式存储和列式存储的优劣以及如何选择相应的存储类型。

行式存储和列式存储的数据库相关推荐

  1. 行式数据和列式数据对比 存储压缩性能

    一.行式数据库和列式数据库的对比 1.存储比较 行式数据库存储在hdfs上式按行进行存储的,一个block存储一或多行数据.而列式数据库在hdfs上则是按照列进行存储,一个block可能有一列或多列数 ...

  2. 数据库—行式存储和列式存储

    1. 数据库的存储模式 1.1 关系型数据库 关系型数据库RDS(Relational Database Service),大部分为行式存储数据. 行式存储: 据以行相关的存储体系架构进行空间分配,主 ...

  3. Mysql框架<二> 行式存储与列式存储

    文章目录 数据处理场景分类 OLTP 联机事务处理 OLAP 联机分析处理 行式存储和列式存储 概念 特点 对比 数据处理场景分类 OLTP 联机事务处理 OLTP : on-line transac ...

  4. 行式存储和列式存储的区别

    文章目录 存储方式 简单对比 列式存储和行式存储它们真正的区别 概述 四大优化策略详解 块遍历 压缩 延迟物化 隐式链接 总结 存储方式 行式存储就是每一行的所有数据存在一个block中,各个bloc ...

  5. 行式存储和列式存储优缺点和paruqet文件结构

    参考文章:行式存储和列式存储优缺点和paruqet文件结构 优缺点分析 列存储优点: 单列数据保存在一起,不同列分开存储,导致存下同样一个表需要更多的Block文件,看起来是更复杂了,但是基于列和列分 ...

  6. “行式存储”和“列式存储”的区别

    https://www.jianshu.com/p/3d3950c9fb06 我们知道 当今的数据处理大致可分为两大类 联机事务处理 OLTP (on-line transaction process ...

  7. 五大存储模型关系模型、键值存储、文档存储、列式存储、图形数据

    五大存储模型关系模型.键值存储.文档存储.列式存储.图形数据 时间:2014-06-12 16:15来源:知行网www.zhixing123.cn 编辑:麦田守望者 昨天跟一同事讨论Sybase是不是 ...

  8. 为什么MaxCompute采用列式存储?列式存储和行式存储的主要区别在哪

    摘要: 1 为什么要按列存储 列式存储(Columnar or column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的.简单来说两者的区别就是如何组织表 ...

  9. DataBase_数据库的行式存储与列式存储

    存储差异 行式存储:以行为单位进行存储,存储在连续的物理内存上 列式存储:以列为单位进行存储,存储在连续的物理内存上 读取差异 animal表: name age color Tom one blue ...

最新文章

  1. 【转载】在对话框中加入属性页
  2. 转:Linux下应用tgtadm构建iSCSI Target(SAN)
  3. hdu 4614 Vases and Flowers
  4. 从 WordCount 到 MapReduce 计算模型
  5. RHEL 5服务篇—使用Apache搭建Web服务(一)
  6. Linux配置汇总上(北大青鸟Linux课程学习总结)
  7. WPF整理-处理没有注意到的异常
  8. 001-Ansible-参考http://www.ansible.com.cn/docs/playbooks_intro.html#about-playbooks
  9. springboot导入项目依赖报错_最详细的 Spring Boot 多模块开发与排坑指南
  10. C#中将DataTable中数据导出到csv文件中
  11. 关于XP系统远程桌面的一点点记录
  12. Python自动控制鼠标
  13. 开服当GM的基本准则
  14. 新开业和新签约酒店 | 上海世茂皇家艾美酒店开业;福州滨海新城那迪广场、Casa Cook桂山岛度假酒店等顺利签约...
  15. html魔方转动效果,html5+css3实现旋转魔方的点点滴滴
  16. ls、ls -a、ls -l、ls -al、ll、ll -a区别
  17. 《MySQL高级篇》三、存储引擎
  18. 解决深度Deepin20应用商店闪退
  19. centOS7 下安装 mysql8.0
  20. 低波动溢价:是否还能持续?

热门文章

  1. 分解质因数(java解决)
  2. Linux exec函数
  3. 【蓝桥杯嵌入式】【STM32】14_CT117E_EXA蓝桥杯嵌入式扩展板硬件资源一览及其驱动编写
  4. 只要活着,我愿意一辈子都做程序员
  5. nyoj 1238 最少换乘(spfa)
  6. deny of sb sth_deny的短语
  7. CarSim与多版本MATLAB联合仿真问题
  8. 深度学习细粒度图像研究汇总
  9. iOS 的UIView 的hitTest的分析
  10. 京东风控团队带你全方位解读特征工程