面试 | 面向行的数据库VS面向列的数据库

运维 数据库运维
数据库的数据存储有两种类型,一种是面向行的(row-oriented)数据库,另一种是面向列的(column-oriented )数据库。

[[422805]]

本文转载自微信公众号「大数据技术与数仓」,作者西贝。转载本文请联系大数据技术与数仓公众号。

总览

数据库的数据存储有两种类型,一种是面向行的(row-oriented)数据库,另一种是面向列的(column-oriented )数据库。

面向行(事务型) 数据库

该类数据库是根据记录(record)组织数据的,将所有与记录相关联的数据保存在内存中。面向行的数据库是组织数据的传统方式,并且为快速存储数据提供了一些关键优势。它们经过优化,可以高效地读取和写入行。

常见的面向行的数据库:

  • PostgreSQL
  • MySQL

优点

  • 行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性;
  • insert/update更容易

缺点

  • 没有索引的查询会产生大量的I/O
  • 建立索引需要花费大量时间和资源
  • 面对查询的需求,数据库必须被大量膨胀才能满足性能的需求

面向列(分析型) 数据库:

该类数据库是按字段组织数据的,在内存中将所有与字段相关联的数据保存在一起。该类数据库在读取和计算列有明显的优势。

常用的面向列的数据库

  • AWS RedShift
  • Google BigQuery
  • HBase

优点

  • 只查询涉及的列,会大量降低系统I/O,适合并发查询
  • 数据类型一致,数据特征相似,能对数据进行高效压缩
  • 非常适合做聚合操作

缺点

  • 缺乏数据完整性保证,写入效率低
  • 不适合频繁delete/update操作

面向行的数据库

传统的关系型数据库管理系统(DBMS)都是面向行的。在行存储或面向行的数据库中,数据是逐行存储的,这样,行的第一列将挨着前一行的最后一列。

比如,有下面的一张表

这些数据将被存储在一个面向行的数据库中的一个磁盘上,按照下面这样的顺序一行一行的排列:

这允许数据库快速写入一行,因为要写入数据,只需在数据的末尾添加另一行即可。

面向行的数据库仍然通常用于联机事务处理(OLTP)的应用程序,因为它们可以很好地管理对数据库的写操作。对于联机分析处理(OLAP)的场景需要一个支持特定数据查询的数据库。这就是面向行的数据库比面向列的数据库慢的地方。

读取面向行的数据库

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

因此,我们可以看到,虽然向面向行的数据库添加数据是快速和简单的,但从中获取数据可能需要使用额外的内存和访问多个磁盘。

面向列的数据库

数据仓库的创建是为了支持数据分析。这些类型的数据库通常对数据读取做了优化。

在面向列的数据库中,数据的存储形式为列中的每一行都挨着同一列中的其他行。

仍然以上面的表为例:

一个表一次存储一列,按照一行一行的顺序排列:

写入面向列的数据库

如果我们想要添加一个新记录,必须先定位数据的位置(比如HBASE的三级寻址),将每一列插入到它应该在的位置。

如果数据存储在一个单独的磁盘上,那么它将有与面向行的数据库相同的额外内存问题,因为它需要将所有内容都放入内存中。但是,当存储在单独的磁盘上时,面向列的数据库将有很大的好处。

从面向列的数据库中读取

只需要计算需要的列,减少磁盘扫描,减少不必要的内存开销,只需要访问极少数量的磁盘。

附录(SQL知识大图)

 

责任编辑:武晓燕 来源: 大数据技术与数仓
相关推荐

2009-12-09 14:21:14

VS 2005 Tea

2010-08-02 16:19:00

ibmdw面向对象

2015-06-23 13:56:30

数据库设计面向对象

2021-07-12 11:32:36

数据库悲观模式

2020-10-22 12:53:45

数据库云服务全密态

2009-12-09 15:53:16

Visual Stud

2010-08-26 09:01:27

Infobright

2010-08-26 09:13:02

Infobright

2016-10-14 19:30:21

云计算云数据库数据库

2015-10-09 10:49:06

AWS数据库迁移RDS

2016-11-09 13:46:00

云数据库

2011-06-29 14:01:30

多数据库实例效率

2016-08-05 09:51:25

GPU大数据

2011-03-17 12:33:56

面向对象数据库电子商务

2011-03-17 13:00:27

面向对象数据库电子商务

2013-07-17 09:42:34

云计算数据库NoSQL

2011-05-13 09:42:21

2011-05-13 13:54:02

数据库文档数据库

2010-04-22 16:16:35

Oracle数据库

2011-05-13 13:38:49

数据库对象
点赞
收藏

51CTO技术栈公众号