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

为什么数据库分为“行存储”和“列存储”?

时间:2023-03-17 18:26:00 科技观察

我们知道今天的数据处理大致可以分为两类:OLTP(联机事务处理)和OLAP(联机分析处理)。OLTP是传统关系型数据库的主要应用。对数据库记录进行增、删、改、查等一些基本的、日常的事务处理,而OLAP是分布式数据库的主要应用。对实时性要求不高,但处理的数据量大,通常应用复杂OLTP和OLAP在动态报表系统上的主要区别OLTP和OLAP为什么在数据库的应用类别上有显着差异?其实这是由于数据库的存储方式不同造成的。Oracle、DB2、MySQL、SQLSERVER等数据库,都采用基于行的存储方式(Row-based)。在基于行的存储数据库中,数据按照行数据作为基本的逻辑存储单元进行存储。一行中的数据在存储介质中以连续存储的形式存在。列式存储是相对于行式存储而言的。Hbase、HPVertica和EMCGreenplum等新兴的分布式数据库都使用基于列的存储。在基于列存储的数据库中,数据按照列为基本逻辑存储单元进行存储,列中的数据以连续存储的形式存在于存储介质中。行存储的适用场景包括:1.适用于随机增删改查操作;2、需要连续选择所有属性的查询操作;3.需要频繁插入或更新的操作,并且操作的大小大于相关索引和行的大小。在实践中,我们会发现基于行的数据库在读取数据时有一个先天的“缺陷”。例如,即使选择的查询目标只涉及几个属性,目标数据也被埋藏在每一行数据单元中。单位往往很大,应用程序必须读取每条完整的行记录,这大大降低了读取效率。对此,行数据库给出的优化方案是通过索引机制在OLTP类型的应用中加入“索引”或者通过给表分区等手段可以简化查询操作步骤,提高查询效率,但是对于OLAP应用(如分布式数据库、数据仓库等)在海量数据背景下,行式数据库有些“力不从心”。物化视图需要大量的时间和资源,因此得不偿失。它们不能从根本上解决查询性能和维护成本的问题,不适合数据仓库等应用场景。因此,后来出现了基于列存储的数据库。对于数据仓库和分布式数据库来说,在大多数情况下,它会汇总各种数据源的数据,然后进行分析和反馈。它的大部分操作都是围绕同一列属性的数据进行的。当查询某个属性的数据记录时,列数据库只需要返回与该列属性相关的信息即可。在大数据量查询场景下,列式数据库可以高效地将内存中每一列的值组装起来形成关系记录集,因此可以显着降低IO消耗和查询响应时间。非常适用于数据仓库和分布式应用的列式存储。该引擎的适用场景包括:1、在查询过程中,各列的操作可以并发执行(SMP),在内存中聚合完整的记录集,可以减少查询响应时间;2、可以在数据列中间高效查找数据,无需维护索引(任何列都可以作为索引),并且可以在查询过程中尽量减少不相关的IO,避免全表扫描;3、由于每一列都是独立存储的,数据类型已知,可以针对列的数据类型、数据大小等因素动态选择压缩算法,提高物理存储利用率;如果某行某列没有数据,则该列的值不需要存入列存,这样会比行存好。更节省空间。当然,和行数据库一样,列存储也有不适合的场景,主要包括:需要频繁更新数据的事务场景随着数据库的发展,传统的行数据库增加了列存储的支持,形成具有两种存储方式的数据库系统。例如,随着Oracle12c中内存组件的引入,Oracle数据库拥有了双模式的数据存储方式,可以支持混合类型的应用。当然,列式数据库也支持行式存储,比如HPVertica。总之,没有完美的数据库,一切都要根据实际的数据存储和分析需求!