这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天,本文主要以概括总结,全局记录为主,而不是作为细致的知识点讲解,细节之处多有疏忽还望多多包容。
一、本堂课重点内容:
- 列式存储
二、详细知识点介绍:
列式存储的优点
LZ4
输入:abcde_bcdefgh_abcdefghxxxxx
输出:abcde_(5,4)fgh_(14,5)fghxxxxx
- (5,4)代表向前 5 个 byte,匹配到的内容长度有 4,即”bcde“是一个重复
- 重复项越多, 压缩率也就越高
输入:wwwwwwwwwbwwwww
输出:9w1b5w
Run-length encoding
- 压缩重复的数据
- 可以在压缩数据上直接计算
输入:100, 110, 130, 135
输出:100(base), 10, 20, 5
Data encoding
- 将数据存储为连续数据之间的差异,而不是直接存储数据本身
- 特定算子也能直接在压缩数据上计算
可以选择特定的列做计算而不是读所有的列,且对聚合计算友好
延迟物化:可以尽可能地推迟物化的时间
- 对cpu/内存带宽友好
- 缓存友好
- 可以利用执行计划的算子的优化,例如 filter
- 保留直接在压缩列做运算的机会
向量化
- SIMD:(single instruction multiple data),对于现代多核cpu,其都有能力用一条指令执行多条数据
- 数据格式:需要处理多个数据,因此数据需要连续内存,并且需要明确数据类型
- 执行模型:数据需要按批读取,函数的调用需要明确数据类型
列存的缺点
- 点查询不适合
- INSERT/UPDATE 比较麻烦
- 选择完成时,被选择的列需要重新组装
列存的适用场景
- 统计分析类查询
- 即时查询
行存的缺点
- 选择(select)时,即使要几列,也还得全部查出来
行存的使用场景
- 点查询
- 增删改查
数据库的类型
三、课后个人总结:
- ClickHouse 作为一个全新的列式存储数据库,应用场景也不逊于 MySQL,期待明天的数据库设计