1、什么是行存储和列存储?
传统的关系型数据库,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存储法(Row-based),在基于行式存储的数据库中, 数据是按照行数据为基础逻辑存储单元进行存储的, 一行中的数据在存储介质中以连续存储形式存在。
列存储(Column-based)是相对于行存储来说的,新兴的 Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采用列式存储。在基于列式存储的数据库中, 数据是按照列为基础逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。
2、OLTP和OLAP
在数据库中,数据处理可分为两类:联机事务处理OLTP(on-line transaction processing)和联机分析处理OLAP(On-Line Analytical Processing),OLTP是传统关系型数据库的主要应用,用来执行一些基本的、日常的事务处理,比如数据库增、删、改、查等等,而OLAP则是分布式数据库的主要应用,它对实时性要求不高,但处理的数据量大,通常应用于复杂的动态报表系统上。
OLTP和OLAP的主要区别:
3、行存储和列存储的应用场景
行存储的适用场景:
(1)适合随机的增、删、改、查操作;
(2)需要在行中选取所有属性的查询操作;
(3)需要频繁插入或更新的操作,其操作与索引和行的大小更为相关。
列存储的适用场景:
(1)查询过程中,可针对各列的运算并发执行,在内存中聚合完整记录集,降低查询响应时间;
(2)在数据中高效查找数据,无需维护索引(任何列都能作为索引),查询过程中能够尽量减少无关IO,避免全表扫描;
(3)因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率;如果某一行的某一列没有数据,在列存储时,就可以不存储该列的值,这将比行式存储更节省空间。
在实际应用中我们会发现,行式数据库在读取数据时存在一个固有的缺陷,比如,所选择查询的目标即是只涉及少数几个字段,但由于这些目标数据埋藏在各行数据单元中,而行单元往往又特别大,应用程序必须读取每一条完整的行记录,从而使得读取效率大大较低,对此,行式数据库给出的优化方案是加索引,在OLTP类型的应用中,通过索引机制或给表分区等手段可以简化查询操作步骤,并提升查询效率。
但针对海量数据背景的OLAP应用(例如分布式数据库、数据仓库等),行存储的数据库就有些力不从心了,行式数据库建立索引和物化视图需要花费大量时间和资源,因此还是不划算的,无法从根本上解决查询性能和维护成本的问题,也不适用于数据仓库等应用场景,所以后来出现了基于列式存储的数据库。
对于数据仓库和分布式数据库来说,大部分情况下它会从各个数据源汇总数据,然后进行分析和反馈,其大多数操作是围绕同一个字段(属性)进行的,而当查询某属性的数据记录时,列式数据库只需返回与列属性相关的值。在大数据量查询场景中,列式数据库可在内存中高效组装各列的值,最终形成关系记录集,因此可以显著减少IO消耗并降低查询响应时间,非常适合数据仓库和分布式的应用。