当前位置: 首页 > 科技观察

专访-行式数据库VS列式数据库

时间:2023-03-14 23:05:31 科技观察

本文转载自微信公众号《大数据技术与数据仓库》,作者西贝。转载本文请联系大数据技术与数据仓库公众号。概览数据库有两种数据存储方式,一种是面向行的数据库,一种是面向列的数据库。面向行(事务)数据库这种类型的数据库根据记录来组织数据,并将与记录关联的所有数据存储在内存中。面向行的数据库是组织数据的传统方式,并为快速存储数据提供了一些关键优势。它们经过优化以有效地读取和写入行。常见的面向行的数据库:PostgreSQLMySQL优点行存储是一次性写入的,比列存储消耗的时间少,可以保证数据的完整性;insert/update更容易缺点没有索引的查询会产生大量的I/O索引需要大量的时间和资源来满足查询需求,并且必须扩展数据库以满足性能需求。面向列(分析)的数据库:这种类型的数据库按字段组织数据,并将与字段关联的所有数据保存在一起。这种类型的数据库在读取和计算列方面有明显的优势。常用的面向列的数据库AWSRedShiftGoogleBigQueryHBase优点只查询涉及的列,会大大减少系统I/O,适合并发查询数据类型一致,数据特征相似,可以高效压缩数据非常适合聚合操作缺点欠缺of保证数据完整性,写入效率低不适合频繁的删除/更新操作面向行的数据库传统的关系数据库管理系统(DBMS)都是面向行的。在行存储或面向行的数据库中,数据是逐行存储的,因此一行的第一列紧挨着前一行的最后一列。例如,考虑下表。在面向行的数据库中,数据将存储在磁盘上,按以下顺序逐行:这样可以使数据库快速写入一行,因为要写入数据,只需在末尾添加另一行即可数据。面向行的数据库仍然常用于联机事务处理(OLTP)应用程序,因为它们可以很好地管理对数据库的写入。对于联机分析处理(OLAP)场景,需要一个支持特定数据查询的数据库。这是面向行的数据库比面向列的数据库慢的地方。面向行的数据库面向行的数据库可以快速检索一行或一组行,但在执行聚合时,它会将额外的数据(列)带入内存,这比仅选择列来执行聚合要慢。此外,面向行的数据库可能需要访问的磁盘数量通常更多。因此我们可以看到,虽然将数据添加到面向行的数据库既快速又容易,但从中获取数据可能需要使用额外的内存和访问多个磁盘。创建面向列的数据库数据仓库以支持数据分析。这些类型的数据库通常针对读取数据进行了优化。在面向列的数据库中,数据的存储方式是一列中的每一行都与同一列中的其他每一行相邻。仍以上表为例:一张表一次存储一列,按一行一行的顺序排列:写入面向列的数据库如果我们要新增一条记录,首先要定位到数据的位置(例如HBASE的三级寻址),将每一列插入到它应该在的地方。如果数据存储在单独的磁盘上,那么它将与面向行的数据库一样存在额外的内存问题,因为它需要将所有内容都放入内存中。但是,当存储在单独的磁盘上时,面向列的数据库将有很大的好处。从列式数据库读取只需要计算需要的列,减少磁盘扫描,减少不必要的内存开销,只需要访问极少量的磁盘。附录(SQL知识大图)