数据库行式存储和列式存储
数据库行式存储和列式存储
数据库存储格式是数据库管理系统中一个至关重要的方面,它直接影响到数据的组织和检索效率。在数据库中,有两种主要的存储格式,即行式存储和列式存储。这两者采用截然不同的方法来组织和存储数据,各自具有一系列优势和劣势。
行式存储:在行式存储中,表的单行数据被一起存储在磁盘上的一个块或页面中。这意味着给定行的所有列都被一起存储,这对于需要一次检索整行数据的操作(如SELECT查询)是有效的。然而,对于只需要访问表中某些列的操作,行式存储可能效率较低。
列式存储:在列式存储中,表的每一列都被单独存储在磁盘上,这意味着给定列的所有值都被一起存储。对于只需要访问表中某些列的操作,这可能更为高效,因为数据库可以避免读入不必要的数据。列式存储在某些类型的查询(例如涉及聚合或仅涉及一列的计算的查询)方面也可能更为高效。
混合式存储:一些数据库采用混合式存储方法,将行式和列式存储结合起来使用。在这种方法中,数据库可能以列式格式存储经常访问的列,而以行式格式存储不太频繁访问的列。这可以提供两种方法的优势,但实施和管理可能更为复杂。
简单来说 行式存储
的存储单位是行,列式存储
的基本单位是列
行式存储
将行式存储想象成每个学生的个人信息,包括学号,姓名,性别,家庭住址等。当想查询某个学生的信息时,可以一次性得到所有的信息。
行存的时候,一行记录的属性值存储在临近的空间,然后接着是下一条记录的属性值。
列式存储
列存的时候,单个属性所有的值存储在临近的的空间,即一列的所有数据连续存储的,每个属性有不同的空间。
数据写入对比
- 行存储的写入是一次完成。如果这种写入建立在操作系统的文件系统上,可以保证写入过程的成功或者失败,数据的完整性因此可以确定。
- 列存储由于需要把一行记录拆分成单列保存,写入次数明显比行存储多(意味着磁头调度次数多,而磁头调度是需要时间的,一般在1ms~10ms),再加上磁头需要在盘片上移动和定位花费的时间,实际时间消耗会更大。所以,行存储在写入上占有很大的优势。
- 还有数据修改,这实际也是一次写入过程。不同的是,数据修改是对磁盘上的记录做删除标记。行存储是在指定位置写入一次,列存储是将磁盘定位到多个列上分别写入,这个过程仍是行存储的列数倍。所以,数据修改也是以行存储占优。
数据读取对比
- 行存储通常将一行数据完全取出,如果只需要其中几列数据的情况,就会存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。
- 列存储每次读取的数据是集合的一段或者全部,不存在冗余性问题。
- 两种存储的数据分布。由于列存储的每一列数据类型是同质的,不存在二义性问题。比如说某列数据类型为整型 (int),那么它的数据集合一定是整型数据。这种情况使数据解析变得十分容易。相比之下,行存储则要复杂得多,因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗 CPU,增加了解析的时间。所以,列存储的解析过程更有利于分析大数据。
- 从数据的压缩以及更性能的读取来对比。同一列的数据,数据类型一致,列存的模式下就适合数据压缩,不同的列可以采用不同的压缩算法,压缩存储就会带来 IO 性能的提升。
优缺点比较
表的存储类型是表定义设计的第一步,客户业务类型是决定表的存储类型的主要因素。行、列存储模型各有优劣,建议根据实际情况选择。
行、列存优缺点及适用场景比较见下表:
行存 | 列存 | |
---|---|---|
优点 | 数据被保存在一起。INSERT/UPDATE 容易。 | 查询时只有涉及到的列会被读取。投影 (Projection) 很高效。任何列都能作为索引。 |
缺点 | 选择 (Selection) 时即使只涉及某几列,所有数据也都会被读取。 | 选择完成时,被选择的列要重新组装。INSERT/UPDATE 比较麻烦。点查询不适合。 |
适用场景 | 点查询 (返回记录少,基于索引的简单查询)。增、删、改操作较多的场景。 | 统计分析类查询 (OLAP,比如数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少,关联、分组操作较多)。即时查询(查询条件不确定,行存表扫描难以使用索引)。 |
蚂蚁🐜再小也是肉🥩!
“您的支持,我的动力!觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”
微信支付
支付宝支付