行存储和列存储的区别及各自的应用场景


一、定义

  • 行式存储把一行中的数据值串在一起存储起来,然后再存储下一行的数据,以此类推
  • 列式存储把一列中的数据值串在一起存储起来,然后再存储下一列的数据,以此类推

二、例子1

数据库以行、列的二维表的形式表示数据,但是却以一维字符串的方式存储,举个例子

上面的表包括 Empid,Lastname、Firstname,Salary 四个字段。

数据库会把这个表存储在一系列的一维字节中,由操作系统将这一系列的字节写到磁盘中。

行式数据库把一行中的数据串在一起存储起来,然后再存储下一行的数据,以此类推,如下:

```

1,Smith,Joe,40000;2,Jones,Mary,50000;3,Johnson,Cathy,44000;

```


列式数据库把一列中的数据串在一起存储起来,然后再存储下一列的数据,依次类推,如下:

```

1,2,3;Smith,Jones,Johnson;Joe,Mary,Cathy;40000,50000,44000;

```

上面是简化的说法,只是为了便于表达意思。


三、例子2
在行式数据库中,每一行数据都看做一个整体,可以被认为是一小块数据,这样每一块数据都是紧挨着另一块数据存放在硬盘中。一般情况下,可以认为每一行存储的数据就是硬盘中的一组连续的字节。

为了方便讨论,有如下表,假设每一行都包含一个用户的信息,每个用户的所有属性都整块的存储在硬盘上


在硬盘上,大量的页面用来存储所有的数据。现在假设数据库中的每行信息都存储在同一页上,也就是说,每一页只能保存一个用户的所有信息。在上面的例子中,Alice 的所有信息都被存储到一个页面中,如果需要获取或者更新 Alice 的信息,那么某一时刻在内存中仅需存储关于 Alice 的单一页面。如所示:

好了,现在目光转向列式存储。如果是基于列的数据库,所有的数据都是以列的形式存储的。同样,我们假设每一列的存储只对应一个页面,那么用户的每个属性信息都会被单独存储在一个页面,如下:

那么,现在考虑如下场景。如果使用的是行式数据库,你正好需要对一行数据进行操作时,数据库的性能是最好的,因为仅一个页面被放到了内存中(这只是个示例,实际上操作系统会带来不止一个页面的数据)。

但是,如果你只是想对表中所有数据的某一列的数据做一些操作,这意味着你将花费时间去访问每一行,可你用到的仅是一行中的小部分数据。此时使用的若是列式数据库,就可以方便快捷的访问数据,因为每一列的信息都是存储在一起的。

蛋疼的时候来了,假如现在使用的是列式存储,你又想获取 Alice 的所有信息,那你又必须去读取大量的列(页面)来获取所有的数据。

正因为如此,才有了行式存储和列式存储的使用场景的区别。


当你的核心业务是 OLTP 时,一个行式数据库,再加上优化操作,可能是个最好的选择。
当你的核心业务是 OLAP 时,一个列式数据库,绝对是更好的选择

猜你喜欢

转载自blog.csdn.net/forward__/article/details/80472665