1、概述
在传统的行式数据库系统中,数据按如下顺序存储:
Row | WatchID | JavaEnable | Title | GoodEvent | EventTime |
---|---|---|---|---|---|
#0 | 89354350662 | 1 | Investor Relations | 1 | 2016-05-18 05:19:20 |
#1 | 90329509958 | 0 | Contact us | 1 | 2016-05-18 08:10:20 |
#2 | 89953706054 | 1 | Mission | 1 | 2016-05-18 07:38:00 |
#N | … | … | … | … | … |
处于同一行中的数据总是被物理的存储在一起。
常见的行式数据库系统有:MySQL、Postgres 和 MS SQL Server。
在列式数据库系统中,数据按如下的顺序存储:
Row: | #0 | #1 | #2 | #N |
---|---|---|---|---|
WatchID: | 89354350662 | 90329509958 | 89953706054 | … |
JavaEnable: | 1 | 0 | 1 | … |
Title: | Investor | Relations | Contact us Mission | … |
GoodEvent: | 1 | 1 | 1 | … |
EventTime: | 2016-05-18 05:19:20 | 2016-05-18 08:10:20 | 2016-05-18 07:38:00 | … |
这些示例只显示了数据的排列顺序。来自不同列的值被单独存储,来自同一列的数据被存储在一起。
常见的列式数据库有: Vertica、 Paraccel (Actian Matrix,Amazon Redshift)、 Sybase IQ、 Exasol、 Infobright、 InfiniDB、 MonetDB (VectorWise, Actian Vector)、 LucidDB、 SAP HANA、 Google Dremel、 Google PowerDrill、 Druid、 kdb+。
不同的数据存储方式适用不同的业务场景,数据访问的场景包括:进行了何种查询、多久查询一次以及各类查询的比例;每种类型的查询(行、列和字节)读取多少数据;读取数据和更新之间的关系;使用的数据集大小以及如何使用本地的数据集;是否使用事务,以及它们是如何进行隔离的;数据的复制机制与数据的完整性要求;每种类型的查询要求的延迟与吞吐量等等。
系统负载越高,依据使用场景进行定制化就越重要,并且定制将会变的越精细。没有一个系统能够同时适用所有不同的业务场景。如果系统适用于广泛的场景,在负载高的情况下,要兼顾所有的场景,那么将不得不做出选择。是要平衡还是要效率?
2、行存储、列存储对比
Row-based | Column-based | |
---|---|---|
写入 | 每一行的所有字段都存在一起 优点:对数据进行插入和修改操作很方便 |
当一条新数据到来,每一列单独存储 缺点:插入和修改操作麻烦 |
查询 | 查询时即使只涉及某几列,所有数据也都会被读取 优点:适合随机查询;在整行的读取上,要优于列式存储 缺点:行式存储不适合扫描,这意味着要查询一个范围的数据 |
查询时只有涉及到的列会被读取 缺点:查询完成时,被查询的列要重新进行组装 |
寻道范围 | 读取数据的时候硬盘寻址范围很大 | 由于仅对需要的列进行查找,因此硬盘寻道范围小 |
索引 | 缺点:要加速查询的话需要建立索引,建立索引需要花费很多时间 | 优点:任何列都能作为索引(每一列单独存储,查询个别列的时候,可以仅读取需要的那几个列,相当于为每一列都建立了索引) |
压缩 | 缺点:不利于压缩 | 把一列数据保存在一起,而一列的数据类型相同 优点:利于压缩 |
空间 | 按行存储,不利于压缩,压缩比较差,占空间大 | 列式存储的时候可以为每一列创建一个字典,存储的时候就仅存储数字编码即可,降低了存储空间需求 |
聚合 | 不利于聚合操作 | 按列存储,利于数据聚合操作 |
使用场景 | OLTP(存储关系型数据,用于使用数据的时候需要经常用到数据之间的依赖关系的场景,即读取的时候需要整行数据或者整行中大部分列的数据,需要经常用到插入、修改操作) | OLAP(分布式数据库和数据仓库,适合于对大量数据进行统计分析,列与列之间关联性不强,仅进行插入和读取操作的场景) |
(1)数据写入对比
行存储的写入是一次完成。如果这种写入建立在操作系统的文件系统上,可以保证写入过程的成功或者失败,数据的完整性因此可以确定。
列存储由于需要把一行记录拆分成单列保存,写入次数明显比行存储多(意味着磁头调度次数多,而磁头调度是需要时间的,一般在1ms~10ms),再加上磁头需要在盘片上移动和定位花费的时间,实际时间消耗会更大。所以,行存储在写入上占有很大的优势。
还有数据修改,这实际也是一次写入过程。不同的是,数据修改是对磁盘上的记录做删除标记。行存储是在指定位置写入一次,列存储是将磁盘定位到多个列上分别写入,这个过程仍是行存储的列数倍。所以,数据修改也是以行存储占优。
行式存储的优势是写操作。基于行存的数据,在写入、更新、删除时,只需要找到这一行进行一次操作即可。在读取方面,哪怕只想读取其中的一列都需要找到整行,再从整行中进行读取。
(2)数据读取对比
数据读取时,行存储通常将一行数据完全读出,如果只需要其中几列数据的情况,就会存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。
列存储每次读取的数据是集合的一段或者全部,不存在冗余性问题。
由于列存储的每一列数据类型是同质的,不存在二义性问题。比如说某列数据类型为整型(int),那么它的数据集合一定是整型数据。这种情况使数据解析变得十分容易。相比之下,行存储则要复杂得多,因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗CPU,增加了解析的时间。所以,列存储的解析过程更有利于分析大数据。
列存储在查询过程中,可针对各列的运算并发执行(SMP),在内存中聚合完整记录集,可能降低查询响应时间;可在数据列中高效查找数据,无需维护索引(任何列都能作为索引),查询过程中能够尽量减少无关IO,避免全表扫描;因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率;如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值,这将比行式存储更节省空间。
从数据的压缩以及更性能的读取来对比,列存储由于是同质性数据,可以针对性的进行数据压缩和查询性能提升。
3、列式存储的优势
3.1 高效的数据压缩
传统的行式存储数据库将一行中的所有数据存储在一起,这意味着每次数据访问都需要读取整个行,包含了多个不同类型的数据,导致压缩效率低下。而列式存储数据库则将相同类型的数据放在一起,这样可以采用更加高效的压缩算法,可以大幅度地提升数据压缩的效率。
- 运行长度编码(RLE)可以将重复的值压缩成一个值和一个计数器,这在数据重复较多的情况下效果显著;
- 差分编码(Delta Encoding)通过存储差异值而不是实际值,减少了存储空间;
- 字典编码(Dictionary Encoding)则通过建立字典来替换原始数据,从而减少了存储的位数。
由于这些高效的压缩算法,列式存储数据库在存储大量数据时能够显著减少存储空间占用,从而降低存储成本。
3.2 加速查询性能
列式存储数据库在查询性能方面具有显著优势。因为查询通常只涉及到特定的列,而不是整个行,所以列式存储只需要读取相关的列数据,从而减少了I/O操作。
例如,在一个包含数百万行的大型数据库中,如果只需要查询某一个列的数据,列式存储数据库只需读取该列的数据,而行式存储数据库则需要读取每一行的所有数据。这种差异在大规模数据查询时尤为明显,可以显著提升查询性能。
此外,列式存储数据库可以利用列上的索引和压缩算法,加速数据检索和过滤操作。
例如,在执行聚合查询(如SUM、AVG等)时,列式存储数据库可以直接操作压缩后的数据,从而减少计算量和内存占用。这使得列式存储数据库在处理数据仓库和大数据分析场景中表现尤为出色。
3.3 降低存储成本
列式存储数据库通过高效的数据压缩显著降低了存储成本。传统的行式存储数据库需要为每一行存储完整的数据,而列式存储数据库则可以利用数据的重复性和相似性,大幅度减少存储空间。例如,在一个包含大量重复值的数据库中,列式存储可以通过运行长度编码将重复值压缩为一个值和一个计数器,从而节省大量存储空间。更少的存储空间意味着更低的存储成本,不仅在硬件投入上减少了开支,还能降低数据传输和处理时的能源消耗。此外,列式存储数据库的高效压缩还可以提高数据的传输速度,减少网络带宽的占用,从而进一步降低运营成本。
3.4 优化读操作
列式存储数据库在读操作方面具有显著优势,尤其在数据分析和报表生成等读密集型应用中表现突出。因为列式存储数据库将相同类型的数据存储在一起,可以利用缓存更高效地读取数据。例如,在进行大规模数据分析时,列式存储数据库可以一次性读取整列数据,并通过并行处理加速查询操作。这不仅减少了I/O操作,还能充分利用多核处理器的计算能力,从而显著提高读操作的性能。此外,列式存储数据库的压缩算法可以减少数据读取量,进一步优化读操作。例如,在执行数据筛选和过滤操作时,列式存储数据库可以直接操作压缩后的数据,从而减少数据读取量和内存占用。这使得列式存储数据库在处理大规模数据集时,能够提供更快的响应速度和更高的查询效率。
3.5 增强数据分析能力
列式存储数据库在数据分析能力方面具有显著优势,尤其在处理大规模数据集和复杂查询时表现出色。因为列式存储数据库将相同类型的数据存储在一起,可以更高效地执行聚合查询和分析操作。例如,在进行数据聚合(如SUM、AVG、MAX等)时,列式存储数据库可以直接操作压缩后的数据,从而减少计算量和内存占用。此外,列式存储数据库的高效压缩和查询性能,使得它在实时数据分析和报表生成方面表现优异。例如,在进行实时数据分析时,列式存储数据库可以快速读取和处理大量数据,提供即时的分析结果和决策支持。这使得列式存储数据库在数据驱动的业务决策和大数据分析中,成为不可或缺的重要工具。