数据库⾏存储和列存储的区别
1、什么是⾏存储和列存储?
传统的关系型数据库,如 Oracle、DB2、MySQL、SQL SERVER 等采⽤⾏式存储法(Row-based),在基于⾏式存储的数据库中,数据是按照⾏数据为基础逻辑存储单元进⾏存储的,⼀⾏中的数据在存储介质中以连续存储形式存在。
列存储(Column-based)是相对于⾏存储来说的,新兴的 Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采⽤列式存储。在基于列式存储的数据库中,数据是按照列为基础逻辑存储单元进⾏存储的,⼀列中的数据在存储介质中以连续存储形式存在。
2、OLTP和OLAPgreenplum数据库
在数据库中,数据处理可分为两类:联机事务处理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消耗并降低查询响应时间,⾮常适合数据仓库和分布式的应⽤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论