列式存储

OLAP中数据存储的问题

OLAP 需要队列进行选择,行式存储按行存数据,使用索引加快对数据的查找(索引包括聚集索引(表记录的排列顺序与索引的排列顺序一致)和非聚簇索引(非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致))。这种方式对按列的存储和检索不是很高效,查询某一列数据需要将所有行的数据扫描一次,而且对统计分析也不友好。

列式存储原理

若使用列式存储可以只用扫描出需要的列,行、列存储的对比。
在这里插入图片描述

文件格式

parquet 文件格式:

如下图所示:parquet file = header + block * N + footer

在这里插入图片描述

header :

block :

转换成层次图如下
在这里插入图片描述
其中

行组(Row Group):按照行将数据物理上划分为多个单元,每一个行组包含一定的行数,在一个HDFS文件中至少存储一个行组,Parquet读写的时候会将整个行组缓存在内存中,所以如果每一个行组的大小是由内存大的小决定的。

列块(Column Chunk):在一个行组中每一列保存在一个列块中,行组中的所有列连续的存储在这个行组文件中。不同的列块可能使用不同的算法进行压缩。

页(Page):每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。

footer:

文件中所有的metadata都存在于footer中。footer中的metadata包含了格式的

  1. 版本信息
  2. schema信息
  3. key-value paris
  4. 所有block中的metadata信息。

footer中最后两个字段为一个以4个字节长度的footer的metadata,以及同header中包含的一样的PAR1。

字典页

在Parquet中,有三种类型的页:数据页、字典页和索引页。数据页用于存储当前行组中该列的值,字典页存储该列值的编码字典,每一个列块中最多包含一个字典页,索引页用来存储当前行组下该列的索引,目前Parquet中还不支持索引页,但是在后面的版本中增加。通过字典页可以压缩数据,原理如下图。http协议也用到了这种数据压缩方式。
在这里插入图片描述

列式存储查询数据

在这里插入图片描述

特点

  1. 映射下推
  2. 谓词下推

总结

行、列存储对比:

行式存储-优点

Ø 数据被保存在一起
Ø INSERT/UPDATE容易
Ø 查询时只有涉及到的列会被读取

列式存储-优点

Ø 投影(projection)很高效
Ø 任何列都能作为索引

行式存储-缺点

Ø 选择(Selection)时即使只涉及某几列,所有数据也都会被读取

列式存储-缺点

Ø 选择完成时,被选择的列要重新组装
Ø INSERT/UPDATE比较麻烦

参考:

官网:https://parquet.apache.org/
parquet 工具: https://github.com/wesleypeck/parquet-tools
blog:https://mp.weixin.qq.com/s/r0N8LOTmONAgoqFklznhgg

<think>嗯,用户问的是列式存储数据库,我得先弄清楚列式存储的基本概念。首先,列式存储和传统的行式存储有什么区别呢?行式存储是把每一行的数据连续存储,而列式存储是把每一列的数据存在一起。比如,行式存储中,一个用户的所有信息(姓名、年龄、地址)是连续存放的,而列式则是把所有用户的姓名放在一起,年龄放在另一块,地址再另一块。 那这样做有什么好处呢?可能是在查询时,如果只需要某几列的数据,列式存储可以更快读取,因为不需要扫描整行数据。特别是对于大数据分析,经常需要聚合操作,比如求和、平均值,这时候列式存储效率更高,因为数据按列存储,压缩率也更高,相同类型的数据在一起更容易压缩。 不过,列式存储有没有缺点呢?比如,如果需要频繁地更新单条记录,或者需要读取整行数据时,可能性能不如行式存储。因为每次更新可能涉及多个列,而列式存储中这些列分布在不同的位置,导致写入速度较慢。所以列式数据库更适合读多写少的场景,比如数据仓库、分析型应用。 接下来要想到具体的例子,比如常见的列式数据库有哪些。比如Apache Cassandra其实主要还是列族存储,和纯粹的列式可能不太一样。而Parquet是一种列式存储文件格式,常用于Hadoop生态。还有Google的Bigtable,不过它属于宽列存储。还有Vertica、ClickHouse这些是专门的分析型数据库,采用列式存储结构。 另外,需要提到列式存储在OLAP(在线分析处理)中的应用,和行式存储在OLTP(在线事务处理)中的不同。用户可能想知道适用场景,比如数据分析、报表生成等需要大量扫描和聚合操作的场景适合列式,而高并发的事务处理适合行式。 还有,列式存储的数据压缩优势。因为同一列的数据类型相同,可以使用更高效的压缩算法,比如字典编码、行程长度编码等,减少存储空间,同时提升I/O效率,这在处理海量数据时非常重要。 不过用户可能也会有疑问,比如列式存储如何处理事务?通常列式数据库在事务支持上可能不如行式数据库,但现代的一些列式数据库也在改进这方面,比如支持ACID特性,但可能有所限制。 总结下来,回答的结构应该是先解释列式存储的概念,对比行式存储,说明优缺点,适用场景,常见数据库例子,以及内部技术如压缩和查询优化。同时要注意用中文,按照用户的格式要求,分点清晰,使用LaTeX公式的地方比如数学表达式要用$...$,独立公式用$$...$$,但这个问题可能不需要太多公式,但如果有涉及性能指标或数学表达的地方要注意格式正确。</think>### 列式存储数据库介绍 #### 1. **基本概念** 列式存储数据库(Columnar Database)是一种将数据**按列而非按行存储**的数据库设计。与传统的行式存储(如MySQL、PostgreSQL)不同,列式存储将同一列的所有数据连续存放,例如: - **行式存储**:存储为 `(用户ID, 姓名, 年龄), (1, Alice, 25), (2, Bob, 30)` - **列式存储**:存储为 `用户ID: [1, 2]`, `姓名: ["Alice", "Bob"]`, `年龄: [25, 30]` #### 2. **核心优势** - **高效查询性能** 针对分析型查询(如聚合、统计),只需读取相关列,减少I/O开销。例如计算平均年龄时,仅需扫描`年龄`列。 $$ \text{查询效率提升比例} \propto \frac{\text{总列数}}{\text{目标列数}} $$ - **高压缩率** 同一列数据类型一致,适合压缩(如字典编码、行程长度编码)。例如重复值较多的`性别`列可压缩为`[M:1, F:0]`。 - **向量化处理** 现代列式数据库(如ClickHouse)支持SIMD指令,对列数据批量操作,加速计算。 #### 3. **适用场景** - **OLAP(联机分析处理)** 适合大数据分析、报表生成,例如: ```sql SELECT SUM(sales) FROM table WHERE year = 2023; -- 仅需读取sales和year两列 ``` - **数据仓库** 如Apache Parquet文件格式常用于Hadoop生态。 - **稀疏数据** 若数据中存在大量空值(如传感器数据),列式存储可跳过无效字段。 #### 4. **典型代表** - **ClickHouse**:高性能开源列式数据库,支持实时查询。 - **Apache Cassandra**:宽列存储(混合行+列模式),适合分布式场景。 - **Vertica**:企业级列式数据库,优化复杂分析查询。 #### 5. **与行式存储对比** | **特性** | **列式存储** | **行式存储** | |----------------|---------------------------|---------------------------| | **写入速度** | 较低(需更新多列) | 较高(单行连续写入) | | **读取效率** | 高(仅读取目标列) | 低(需读取整行) | | **压缩率** | 高(同列数据类型一致) | 较低 | | **适用场景** | 分析、聚合 | 事务处理(OLTP) | #### 6. **技术细节** - **数据分块**:列数据划分为块(Block),支持并行处理。 - **延迟物化**:在查询后期才组合多列数据,减少中间结果传输。 - **编码优化**:例如使用`Delta Encoding`存储时序数据,或`Bit-Packing`压缩整数。 #### 7. **局限性** - **事务支持弱**:多数列式数据库对ACID支持有限,不适合高频更新。 - **单行查询慢**:若需获取整行数据,需跨多列读取,性能下降。 #### 8. **实际应用案例** - **电商用户行为分析**:统计用户点击量、购买频次时,仅需读取`用户ID`和`行为类型`列。 - **日志分析**:从TB级日志中快速提取错误码分布(如HTTP状态码)。 --- ### 总结 列式存储数据库通过**按列存储、高效压缩、向量化计算**,显著提升了分析型查询的性能,尤其适合大数据场景下的聚合操作。但其设计牺牲了事务处理能力,需根据业务需求(OLAP vs. OLTP)选择合适的存储方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值