行式存储数据库和列式存储数据库,随着业务深入,技能增长,经常会碰到,今天来理解一下。
列式存储(Clolumn-Based)和行式存储(Row-Based)都是相对于对方的,他们的区别是在磁盘的存储方式不同,所以在读写数据时,方式不同,以至于他们的适用场景也都不同。
列式存储数据库主要包括:HBase,ClickHouse,Druid,HP Vertica(也支持行式存储)
行式存储数据库主要包括传统关系型数据库:MySQL,Oracle,DB2,SQLServer,PostgreSQL
因为是磁盘存储方式不同,所以先跳出固有思维来理解,想象没有excel,没有数据库,身在古代,西门大官人如何记录自己身在各地的红颜知己的信息呢?先直观的看一下需要记录哪些数据。
序号 | 地址 | 腰围 | 长相 | 姓名 |
---|---|---|---|---|
1 | 阳谷县 | 30 | 6 | 潘金莲 |
2 | 郓城县 | 40 | 6 | 阎惜娇 |
3 | 蓟州 | 50 | 6 | 潘巧云 |
4 | 京城 | 30 | 8 | 李师师 |
行式存储
西门大官人没有excel,只有纸和笔记录,所以他先写成如下这种行式存储的方式。在什么地方找谁,找什么样的,奶茶喝腻了,换换口味,一目了然。
这样,现在要找蓟州的红颜,就把所有的扫描查看一遍,找到蓟州的红颜。想找6分的红颜,就再扫描一遍,想找什么就扫描一遍。
这就是一个标准的行式存储,数据按照一行一行的存储,有什么特点呢:
- 数据按行存储,直观查看一条数据的全部信息,修改方便(OLTP)
- 查询需要一条一条的查看(全表扫描),费事,费时
- 创建索引、物化视图消耗时间,资源。
后来,大官人要记录管理的对象越来越多是,这个又不能交给别人去记录,只能亲力亲为,问题出现了,大官人的数据已经记录成一本书了,每次瘾发作了,先看一本书,查看地址,是不是体验特别不好?这没有难道他,他又想到了一种记录方式
列式存储
将序号和行号写到特定的几张纸上,将地址和行号写在特定的几张纸上,将腰围和行号写在特定的几张纸上,将姓名和行号写在指定的几张纸上。
这样,想查找腰围30的,只需要查找腰围的那几张纸,找到行号,再查找记录地址的几张纸,查看地址就可以去哈皮了。体验似乎好起来了。
这样存储有什么特点呢:
- 列式存储。
- 只查询需要的字段,快速。(OLAP)
3,查询某一条数据的全部信息要查询所有的纸再拼接起来,不方便,修改一条数据,要修改多张纸,不方便。
总结
行式存储
- 数据是按行存储的
- 没有索引时,查询使用大量I/O,大数据量是表现不佳。
- 建立索引和物化视图可以优化,但是需要花费大量时间和资源。
- 面对查询的需求,数据库必须被大量膨胀才能满足性能需求。
列式存储
- 数据按列存储–每一列单独存放 。
- 数据即是索引。
- 只访问查询涉及的列–大量降低系统IO 。
- 每一列由一个线索来处理–查询的并发处理。
- 数据类型一致,数据特征相似–高效压缩。
行式存储适用于OLTP,而列式存储适用于大数据场景下的OLAP。实际生产活动中,按照使用场景,进选择合适的存储引擎,发挥组件的最大优势。
(完)(^_^)