行数据库 vs 列数据库
是什么
- 列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理和即时查询。
- 行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合于小批量的数据处理,常用于联机事务型数据处理。
举例
数据库以行、列的二维表的形式存储数据,但是却以一维字符串的方式存储,例如以下的一个表:
EmpId | Lastname | Firstname | Salary |
---|---|---|---|
1 | Smith | Joe | 40000 |
2 | Jones | Mary | 50000 |
3 | Johnson | Cathy | 44000 |
这个简单的表包括员工代码(EmpId), 姓名字段(Lastname and Firstname)及工资(Salary).
这个表存储在电脑的内存(RAM)和存储(硬盘)中。虽然内存和硬盘在机制上不同,电脑的操作系统是以同样的方式存储的。数据库必须把这个二维表存储在一系列一维的“字节”中,由操作系统写到内存或硬盘中。
行式数据库把一行中的数据值串在一起存储起来,然后再存储下一行的数据,以此类推。
1,Smith,Joe,40000;
2,Jones,Mary,50000;
3,Johnson,Cathy,44000;
列式数据库把一列中的数据值串在一起存储起来,然后再存储下一列的数据,以此类推。
1,2,3;
Smith,Jones,Johnson;
Joe,Mary,Cathy;
40000,50000,44000;
优势:
- 由于设计上的不同,列式数据库在并行查询处理和压缩上更有优势。
- 而且数据是以列为单元存储,完全不用考虑数据建模或者说建模更简单了。要查询计算哪些列上的数据,直接读取列就行了。
- 不像行式数据库,一行上有多列,尽管我们只需要分析某些列的数据,也要读取表上的全部数据。比如说这句 sql:“select a, b from table limit 100”, 列式数据库只需要读取 a,b 这两列前 100 行到内存中,而行式数据库则需要将前 100 行数据都读入内存中。显而易见,列式数据库的 IO 更高效。
应用:
列存数据库是用来支持一部分数据仓库或集市的应用的。传统数据库做统计分析时的最大瓶颈就是在 IO 数据。所以列存的主要应用场景就是在 99% 的操作都是查询的应用,所有数据库更新的操作都是计划内的而不是随机的。列存的单条记录的增删改操作性能一般,甚至比行存数据库会差不少,但汇总查询超快。适合标准的星形模型结构,多维查询。
传统的行式数据库,是按照行存储的,维护大量的索引和物化视图无论是在时间(处理)还是空间(存储)方面成本都很高。 而列式数据库恰恰相反,列式数据库的数据是按照列存储,每一列单独存放,数据即是索引。只访问查询涉及的列,大大降低了系统 I/O,每一列由一个线来处理,而且由于数据类型一致,数据特征相似,极大方便压缩。
行式数据库擅长随机读操作,列式数据库则更擅长大批量数据量查询
列式数据库优缺点
列式数据库从一开始就是面向大数据环境下数据仓库的数据分析而产生,它跟行式数据库相比当然也有一些前提条件和优缺点.
列式数据库优点
- 极高的装载速度 (最高可以等于所有硬盘 IO 的总和,基本是极限了)
- 适合大量的数据而不是小数据
- 实时加载数据仅限于增加(删除和更新需要解压缩 Block 然后计算然后重新压缩储存)
- 高效的压缩率,不仅节省储存空间也节省计算内存和 CPU.
- 非常适合做聚合操作.
缺点
- 不适合扫描小量数据
- 不适合随机的更新
- 批量更新情况各异,有的优化的比较好的列式数据库(比如 Vertica)表现比较好,有些没有针对更新的数据库表现比较差.
- 不适合做含有删除和更新的实时操作.
原文链接:https://blog.csdn.net/u011397715/article/details/41249081
- 原文作者:战神西红柿
- 原文链接:https://tomatoares.github.io/posts/database/%E8%A1%8C%E6%95%B0%E6%8D%AE%E5%BA%93-vs-%E5%88%97%E6%95%B0%E6%8D%AE%E5%BA%93/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。