01 什么是列式数据库
列式存储(Column-oriented Storage)并不是一项新技术,最早可以追溯到 1983 年的论文 Cantor。然而,受限于早期的硬件条件和使用场景,主流的事务型数据库(OLTP)大多采用行式存储,直到近几年分析型数据库(OLAP)的兴起,列式存储这一概念又变得流行。
总的来说,列式存储的优势一方面体现在存储上能节约空间、减少 IO,另一方面依靠列式数据结构做了计算上的优化。
列式存储的适用场景包括:
1、查询过程中,可针对各列的运算并发执行(SMP),最后在内存中聚合完整记录集,最大可能降低查询响应时间
2、可在数据列中高效查找数据,无需维护索引(任何列都能作为索引),查询过程中能够尽量减少无关IO,避免全表扫描
3、因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率;如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值,这将比行式存储更节省空间
跟行数据库一样,列式存储也有不太适用的场景,主要包括:
1、数据需要频繁更新的交易场景
2、表中列属性较少的小量数据库场景
3、不适合做含有删除和更新的实时操作
02 为什么要使用列式存储
行式存储对于 OLTP(事务型) 场景是很自然的:大多数操作都以实体(entity)为单位,即大多为增删改查一整行记录,显然把一行数据存在物理上相邻的位置是个很好的选择。
然而,对于 OLAP(分析型) 场景,一个典型的查询需要遍历整个表,进行分组、排序、聚合等操作,这样一来按行存储的优势就不复存在了。更糟糕的是,分析型 SQL 常常不会用到所有的列,而仅仅对其中某些感兴趣的列做运算,那一行中那些无关的列也不得不参与扫描。
列式存储就是为这样的需求设计的。
显然,列式存储对于 OLTP 不友好,一行数据的写入需要同时修改多个列。但对 OLAP 场景有着很大的优势:
- 当查询语句只涉及部分列时,只需要扫描相关的列
- 每一列的数据都是相同类型的,彼此间相关性更大,对列数据压缩的效率较高
03 列式存储如何实现高性能
数据库不读取无效数据,提高系统IO
使用列式存储时,我们一般都只查询相关的列,查询条件也是指定的列,与行式存储相比,就少了很多无效数据的读取。
提高了数据压缩比,节省磁盘空间
数据相关性大,压缩比高,可以有效利用Cache
04 列数存储如何高效处理数据
多列族存储,提高新增效率
标记更新,提高更新效率
标记删除,提高删除效率
网友评论