行 | 列 数据库存储方式对比

前言

在学习达梦数据库数据存储过程中有接触到行式存储和列式存储方面的内容,在此作简单的学习分享, 通过本文你可以了解到行存储模式、列存储模式、它们的优缺点以及列存储模式的优化等知识。

Row vs Column Oriented Databases

关系数据库的数据存储方式可以有以下两种:

  1. 面向行存储(Row oriented)
  2. 面向列存储(column oriented

1.行存储

行存储是按记录组织存储,将与记录相关联的所有数据彼此相邻地保存在内存中,即每一行占用一段连续的内存空间,每一行的每一列都是连续的。行存储是组织数据的传统方式,它为快速查询存储数据提供了一些关键优势,针对如何有效地读取和写入行数据进行了相应优化。
常见的行存储数据库有:

  1. PostgreSQL
  2. MySQL
    假设我们在表中有如下用户记录:
[
{
      "ID":1,
      "name":"小红",
      "gender":"女",
       "age":18,
},
{
      "ID":2,
      "name":"小明",
      "gender":"男",
       "age":22,
},
{
      "ID":3,
      "name":"小张",
      "gender":"男",
       "age":20,
},
{
      "ID":4,
      "name":"小王",
      "gender":"男",
       "age":19,
},
]

那么在物理空间中,这些记录的存储形式如下所示:

在这里插入图片描述可以看到行存储中各条记录是按记录顺序逐条存储,每一行的第一列将紧挨前一行的最后一列,每一行中的列是连续的。因此在我们在需要插入新的记录时只需要紧接着上一条记录之后进行插入即可。

2.行存储的优缺点

  1. 优点
    行存储数据库更适合运用在OLTP(Online Transaction Processing)系统中。数据基于行式存储,使得数据在写入时速度更快,并且查询操作也相对简单,我们可以通过记录上的某个属性即可查询到条件符合的单个记录项或者一组记录。
  2. 缺点
    尽管在行式存储数据库在检索单条记录或一组多条记录时的执行速率很快,但在对记录中的某一列进行聚合查询操作时会将多余的数据(列)引入内存,比如需要查询上述数据中的年龄总和,那么行式存储的数据库会将所有的记录读到内存中,如下图所示:

在这里插入图片描述

在对红框中age列执行sum操作时需要一次一次从内存中读取每条记录age列的值,如果有N条这样的记录,那么就要读取磁盘N次,并且不排除会存在读取多个磁盘的情况,假设一个磁盘只能容纳上述一条记录,那么存放全部的记录则需要四个磁盘,这意味着为了得到所有人年龄的总和,计算机需要查看所有四个磁盘以及每个磁盘存放记录中的age列才能进行此查询,完成这么一次聚合查询需要访问四个磁盘。因此行存储方式虽然可以快速添加和查询记录,但同时也需要额外的内存开销和更多的磁盘访问次数。

1.列存储

列存储将每一列的数据组织在一起,数据的存储方式是使列的每一行与同一列中的其他行相邻。

常见的列存储数据库有:

  1. Redshift
  2. BigQuery
  3. Snowflake

其具体的记录存储形式如下图所示:

在这里插入图片描述
可以看到列存储模式下,记录的存储方式是将每一列是数据值收集一并存储到一块连续的内存空间,不同的列在内存中不一定是连续的。列存储在进行新增操作时,需要将一条记录拆分成单列,通过检索导航分别追加写入到列所在的磁盘块中:

在这里插入图片描述

2.列存储的优缺点

优点

1.列存储是各列独立存储,因此其具备大量查询优势,对于目标查询,列存只需要返回目标列的值。因为列值在磁盘中集中存储,这样使得读取磁盘块的频次减少,产生较少IO的数量。最后在内存中高效组装各列的值,形成最终查询结果。另外列式记录每一列数据类型同质,容易解析。每列存储是独立的可以并发处理,进一步提升读取效率。基于这样的特性,列存储模式适用于OLAP(on-Line Analytic Processing)系统,列存储模式能够为数据过滤、统计提供更好的支持。
2. 因为基于列存储,所以每一列本身就相当于索引。因此在做一些需要索引的操作时,就不需要额外的数据结构来为此列创建合适的索引(自动索引)。
3. 数据压缩优势。因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率。

同样的业务场景下,当我们需要统计用户的年龄总和时,只需在进行一次磁盘读取操作读出age列的记录再进行sum操作。特别是在磁盘容量受限的情况下,这样的读取优势更加明显,当磁盘只够容纳一项列记录时,各列数据会被分到四个不同的磁盘进行存储,在同样的查询需求下对比行存储,计算机只需找到存放age列记录的磁盘(Disk 4)再作数据操作,极大程度减少了磁盘访问量和额外的内存开销。

在这里插入图片描述
缺点
插入更新短板。列存储在写入某条记录前需要该条记录拆分成单列,然后分别追加写入到列所在的磁盘块中,如果列比较多,一条记录就会产生多次磁盘块的IO操作。对于实时的逐条写入性能会比行式弱。

对比总结

行存储列存储
适用于联机事务处理(OLTP)系统适用于联机分析处理(OLAP)系统
按行进行数据的读写,读写记录简单可以只读必要的列,写入需要将记录拆分为对应列
不利于数据压缩利于数据压缩
不利于大数据集的聚合操作利于大数据集的聚合操作

DM 武汉达梦数据库股份有限公司
24小时免费服务热线:400 991 6599
达梦技术社区:https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值