这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天, 今天主要了解了列存储clickHouse,学习了列存和行存的区别和优缺点。
数据库分类
数据库是结构化信息或数据的有序集合。 OLTP:主要针对大量事务、点查场景。 OLAP:数据分析,多数据维度
OLAP特点
- 读写,PB级别存储
- 多维分析,需要复杂的聚合函数。
- 窗口函数
- 离线实时分析
SQL
| select | exp | from | table | where | condition | group by | exp | order by | exp |
|---|
优势
- 标准化
- 高度非过程化,用户指出做什么,不用指明怎么做
- 多种方式:命令行或嵌入其他语言
SQL执行
- parser:词法分析语法分析,生成AST树
- analyzer: 变量绑定、语义检查等
- optimizer:生成最优执行计划,进行代价评估
- executor:执行计划翻译成物理计划
列式存储
1.数据压缩
LZ4模型,重复项越多压缩率越高
Run-length encoding模型,压缩重复数据,可直接计算
- 数据选择 聚合计算友好
- 延迟物化,物化指的是列数据转化为计算的过程
- 向量化,SIMD单指令多数据
行存vs列存
| 行存 | 列存 | |
|---|---|---|
| 优点 | insert/update简单 | 投影高效 |
| 缺点 | 选择时数据浪费多 很多时候只需要及列数据 | 列重新组装 insert/update麻烦 点查询不合适 |
| 场景 | 点查询 增删改查多 | 统计分析类查询 即时查询 |
clickhouse存储
索引
常见索引
- hashindex不适合范围查询
- btree 每个节点都按照升序排列key值
- b+tree 叶子节点之间有双向链表,可以方便的范围查询。
LSM tree
注重顺序写入,使用稀疏索引加速查询。
数据结构
- SSTable磁盘数据结构
注意写入磁盘不可更改,只能新写一个替换 - Memtable内存数据结构
实现大多是二叉树
场景
- 大宽表查询,非常多的列
- 线上分析