数据库行存和列存

1.前置存储基础知识

数据库按照存储介质,分为磁盘数据库和内存数据库。对于磁盘数据库,需要依赖于内置硬盘或外置集中式存储设备。

1.1 磁盘存储

1.1.1 磁盘扇区(sector)

磁盘中每个磁道等分为若干弧段,这些弧段被称为扇区。扇区是磁盘的最小存储单元,磁盘的读写以扇区为基本单位。可以使用fdisk -l命令来查看服务器中磁盘扇区的大小,通常是512bytes=0.5K。为什么是这么大,这是一个行业标准(近期也有4K的扇区磁盘)。扇区是一个物理层面的概念,操作系统是不直接和扇区交互的,而是和磁盘块交互。

1.1.2 磁盘块(IO Block)

相邻的磁盘扇区组合在一起构成磁盘块,操作系统对磁盘块进行管理。磁盘块是操作系统最小存储单位,每个磁盘块只能存储一个文件,一个磁盘块的读取对应一次I/O操作。可以使用stat/boot参看,一般一个磁盘块由2、4、8、16、64等个扇区组成,这是操作系统中的逻辑概念,所以可以调节。通常一个磁盘块为4096bytes=4K,即8个连续扇区。

1.1.3 inode

存储文件的元数据信息(文件的创建用户、时间信息、权限等),以及文件数据所在的磁盘块地址信息。如果一个磁盘块不够会申请新的磁盘块,并且在inode中登记新的地址信息。文件读取时候,顺序读取inode中磁盘块的数据,加载至内存中。

1.2 内存存储

内存存储的逻辑读取基本单位为:页(page)。页的大小为磁盘的 2^n倍数,可以使用命令getconf PAGE_SIZE查看。通常和磁盘块大小一致为4K。

1.3 数据库中的页

类似磁盘和内存,数据库中同样页(page)的概念,显然这是一个逻辑的概念。数据库中的数据在磁盘上以文件的形式存储,数据库的存储引擎会以固定大小的page为单位组织文件,读写磁盘也以page为单位。不同数据库page大小有差异,比如:SQLite 1KB, Oracle/DB2 4KB, SQL Server 8KB, MySQL 16KB。

2.概念

行存:数据以行为基础单元组织存储。每行数据间用|线分隔后,整体存储在一个磁盘块中,表中其他记录连续写入文件分配的磁盘块中。
列存:数据以列为单元集中存储。以列为单位顺序存储在一个磁盘块中,其他列同样集中顺序存储,顺序写在前一列后面或者单独写一个文件。

3.优缺点

3.1 行存

优点:随机写入。对于写入的每条记录,只需要内存拼接好整行记录,一次性写入到磁盘块中,单条记录数量小于单个磁盘块就只需要1次IO操作。
缺点:读取冗余。在查询操作中计算机是按照磁盘块为基本单位进行读取,同一个磁盘块中其他记录也需要读取。然后加载至内存,在内存中进行过滤处理。即使查询只涉及少数字段,也需要读取完整的行记录。行存储数据会引入索引和分库分表技术来避免全量读取;数据压缩。每行数据有不同类型数据,数据压缩率较低。

3.2 列存

优点:大量查询操作效率高。对于目标查询,列存只需要返回目标列的值。而且列值在磁盘中集中存储,会减少读取磁盘块的频次,较少IO的数量。最后在内存中高效组装各列的值,最终形成查询结果。另外列式记录每一列数据类型同质,容易解析。每列存储是独立的可以并发处理,进一步提升读取效率;数据压缩。因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率。如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值,这将比行式存储更节省空间,整体上减轻IO的频次;映射下推(Project PushDown)、谓词下推(Predicate PushDown)。可以减少不必要的数据扫描,尤其是表结构比较庞大的时候更加明显,由此也能够带来更好的查询性能。
缺点:写入更新。列式存储写入前需要将一条记录拆分成单列,分别追加写入到列所在的磁盘块中,如果列比较多,一条记录就会产生多次磁盘块的IO操作。对于实时的逐条写入性能会比行式弱。但是对于大量的批写入,列可以在内存中拆分好各分列,然后集中写入,性能和行式数据比不一定差。

4.业务场景使用性分析

在数据库中,数据处理可分为三类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(on-Line analytical processing)和混合事物/分析处理,OLTP是传统关系型数据库的主要应用,用来执行一些基本的、日常的事务处理,比如数据库增、删、改、查等等,而OLAP则是分布式数据库的主要应用,它对实时性要求不高,但处理的数据量大,通常应用于复杂的动态报表系统上,HTAP是OLTP和OLAP两者混合使用。

4.1 联机事物处理(OLTP)

联机事物处理类型通常表示事务性非常高的系统。一般都是联机在线系统,通常以小的事务和小的查询为主。评估系统性能主要看每秒执行的Transaction以及Execute SQL的数量。单个数据库每秒处理的Transaction往往超过几百个,或者是几千个,查询语句的执行量每秒几千甚至几万个。对于互联网秒杀场景要求会更改。典型的OLTP系统有银行、证券、电子商务系统等互联网在线业务系统等。

4.2 联机分析处理(OLAP)

联机分析处理 (OLAP) 即数据仓库。通常一条语句的执行延迟非常长,读取的数据也是海量的。性能评估的指标变为查询的吞吐量,如能达到多少MB/s的流量。数据更新操作少(以大批量写入为主)或没有数据更新和修改,查询结果以统计、聚合计算为主。

4.3 混合事务/分析处理(HTAP)

HTAP 就是 OLAP 和OLTP 两种场景的结合。

4.4 OLTP和OLAP的区别

4.5 行存储的适用场景:

    (1)适合随机的增、删、改、查操作;
    (2)需要在行中选取所有属性的查询操作;
    (3)需要频繁插入或更新的操作,其操作与索引和行的大小更为相关。

4.6 列存储的适用场景:

    (1)查询过程中,可针对各列的运算并发执行,在内存中聚合完整记录集,降低查询响应时间;
    (2)在数据中高效查找数据,无需维护索引(任何列都能作为索引),查询过程中能够尽量减少无关IO,避免全表扫描;
    (3)因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率;如果某一行的某一列没有数据,在列存储时,就可以不存储该列的值,这将比行式存储更节省空间。

参考链接:https://blog.csdn.net/rongxiang20054209/article/details/115287848

posted @ 2024-01-24 15:08  云哲  阅读(149)  评论(0)    收藏  举报