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

154 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天,本文主要以概括总结,全局记录为主,而不是作为细致的知识点讲解,细节之处多有疏忽还望多多包容。

一、本堂课重点内容:

  • 列式存储

二、详细知识点介绍:

列式存储的优点

LZ4

输入:abcde_bcdefgh_abcdefghxxxxx
输出:abcde_(5,4)fgh_(14,5)fghxxxxx
  • (5,4)代表向前 5 个 byte,匹配到的内容长度有 4,即”bcde“是一个重复
  • 重复项越多, 压缩率也就越高
输入:wwwwwwwwwbwwwww
输出:9w1b5w

Run-length encoding

  • 压缩重复的数据
  • 可以在压缩数据上直接计算
输入:100110130135
输出:100(base), 10, 20, 5

Data encoding

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

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

延迟物化:可以尽可能地推迟物化的时间

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

向量化

  • SIMD:(single instruction multiple data),对于现代多核cpu,其都有能力用一条指令执行多条数据
  • 数据格式:需要处理多个数据,因此数据需要连续内存,并且需要明确数据类型
  • 执行模型:数据需要按批读取,函数的调用需要明确数据类型

列存的缺点

  • 点查询不适合
  • INSERT/UPDATE 比较麻烦
  • 选择完成时,被选择的列需要重新组装

列存的适用场景

  • 统计分析类查询
  • 即时查询

行存的缺点

  • 选择(select)时,即使要几列,也还得全部查出来

行存的使用场景

  • 点查询
  • 增删改查

数据库的类型

三、课后个人总结:

  • ClickHouse 作为一个全新的列式存储数据库,应用场景也不逊于 MySQL,期待明天的数据库设计

四、引用参考: