ClickHouse-你没有见过的列存储 | 青训营笔记

67 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
对课程中学到的重要知识点做了笔记,方便后续的回顾

1. 数据库基本概念

1.1 对于普通的数据库改进的话如何考虑

  1. 如何存储数据
  • 是否可以并发处理
  • 是否可以构建索引
  • 行存,列存或者行列混合存储
  1. 如何读写数据?
  • 读多写少
  • 读少写多
  • 点查场景
  • 分析型场景

2. 列式存储

2.1 列式存储优点

2.1.1 数据压缩

  • 数据压缩可以使读的数据量更少,在IO密集型计算中获得更大的性能优势-相同类型压缩效率更高
  • 排序之后压缩效率更高
  • 可以针对不同类型使用不同的压缩算法

数据压缩常用算法

a. LZ4

例子:

输入:abcde_bcdefgh_abcdefghxxXXXXX 输出:abcde_(5,4)fgh_(14,5)fghxXXXXXX

特点:

  • (5.4)代表向前5个byte,匹配到的内容长度有4,即"bcde"是一个重复
  • 重复项越多或者越长,压缩率就会越高

b. Run-length encoding

输入︰ wwwwWwwwwwWlWwWBWwwlwwolwwWWwWwWBBBWWlWwwWwwlwWwolwWwWwWllwwWlWWwlwBWwwWwwWWwWwwwwwl 输出:12w1B12W3B24W1B14w

特点:

  • 压缩重复的数据
  • 可以再压缩数据上直接计算

c. Delta encoding

输入:105,135,112,135,143,147 输出:105(base),30,-23,23,8,4

存储连续数据之间的插值,而不是本身 特点:

  • 将数据存储为连续数据之间的差异,而不是直接存储数据本身
  • 特定算子也能直接在压缩数据上计算

数据选择:

  • 可以选择特定的列做计算而不是读所有列
  • 对聚合计算友好

2.1.2 数据选择

  • 可以选择特定的列做计算而不是读所有列
  • 对聚合计算友好

2.1.3 延迟物化

a 物化

将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤,聚合计算, Join

b 简介

一种数据格式转换成另一种数据格式

c 延迟物化

尽可能的延迟数据格式转换的时间

d 延时物化好处

  • 缓存友好
  • CPU/内存带宽友好
  • 可以利用到执行计划和算子的优化,例如filter
  • 保留直接在压缩列做计算的机会

2.1.4 向量化

a. SIMD (single instruction multiple data)

单指令,多数据
SIMD (single instruction multiple data) ,对于现代多核CPU,其都有能力用一条指令执行多条数据

b. SSE指令集

SIMD程序使用的指令集有SSE和AVX系列,Avx有AVX-256和AVX-512,SSE提供128-bits的寄存器,AVX-256提供256-bits,AVX-512提供512bits的寄存器

c. 向量化的要求

  • 数据格式要求:
    • 需要处理多个数据,因此数据需要是连续内存
    • 需要明确数据类型
  • 执行模型要求:
    • 数据需要按批读取
    • 函数的调用需要明确数据类型
  • 列存数据库适合设计出这样的执行模型,从而使用向量化技术:
    • 按列读取
    • 每种列类型定义数据读写逻辑
    • 函数按列类型处理

2.1 行列式存储比较

行存列存
优点数据被保存在一起INSERT/UPDATE容易查询时只有涉及到的列会被读取。投影(Projection)很高效
任何列都能作为索引
便于做延迟物化和向量化计算
压缩效率高,每一列可以使用不同的压缩算法
缺点选择(Selection)时即使只涉及几列,所有数据也都会被读取选择完成时,被选择的列要重新组装
IlNSERT/UPDATE比较麻烦
点查询不适合
适用场景点查询(返回记录少,基于索引的简单查询)
增、删、改操作较多的场景
统计分析类查询(OLAP,比如数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少,关联、分组操作较多)
即时查询(查询条件不确定,行存表扫描难以使用索引)

课后个人总结

  1. 学习了列式存储的概念,拓展了知识面
  2. 之后再做一下典型应用的笔记

参考资料

[ClickHouse-你没有见过的列存储]juejin.cn/post/719898…