这是我参与「第五届青训营 」伴学笔记创作活动的第 18 天
ClickHouse
数据库分类
根据使用场景
OLTP数据库:高速分析数据库,专为多个用户执行大量事务而设计
OLAP数据库:旨在同时分析多个数据维度,帮助团队更好的理解其数据中的复杂关系
OLAP数据库提供的功能
- 大量读写、PB级别存储
- 多维分析、复杂的聚合函数
- 窗口函数、自定义UDF
- 离线/实时分析
SQL优点
- 标准化、ISO、ANSI是长期建立使用的SQL标准
- 高度非过程化,用户只需提出做什么,无需了解存取路径,其他由系统自动完成,减轻用户负担,提高数据库独立性
- 提供两种使用方式,一个是直接在终端输入SQL命令,另一种是嵌入到高级语言中,比如java、c等等
- 语言简洁、易学易用
行存VS列存
| 行存 | 列存 | |
|---|---|---|
| 优点 | 数据被保护在一起 | 查询时只有涉及到的列会被读取 |
| 投影很高效 | ||
| INSERT/UPDATE容易 | 任何列都能作为索引 | |
| 便于做延迟物化和向量化计算 | ||
| 压缩效率高,每一列可以使用不同的压缩算法 | ||
| 缺点 | 选择时即使只涉及某几列,所有的数据也都会被读取 | 选择完成时,被选择的列要重新组装 |
| INSERT/UPDATE比较麻烦 | ||
| 点查询不适合 | ||
| 适用场景 | 点查询 | 统计分析类查询(OLAP) |
| 增删改操作多 | 即时查询 |
索引设计
传统数据库
Hash Index
- 将输入的Key通过一个HashFunction映射到一组bucket上
- 每个bucket都包含一个指向一条记录的地址
- 哈希索引在查找的时候只适用于等值比较
B-Tree
-
数据写入是有序的,支持增删查改
-
每个节点有多个孩子节点
-
每个节点都按照升序排列key值
-
每个key有两个指向左右孩子节点的引用
- 左孩子节点保存的key都小于当前key
- 右孩子节点保存的key都大于当前key
B+Tree
- 所有的数据都存储在叶子节点,非叶子节点只保存key值
- 叶子节点维护到相邻叶子节点的引用
- 可以通过key值做二分查找,也可以通过叶子节点做顺序访问
ClickHouse数据库
LSM-Tree
专为大吞吐写入场景设计的数据结构
-
着重优化顺序写入
-
主要数据结构
- SSTables(key按顺序存储到文件中,称为segment,写入磁盘后不可更改,只能删除重新写入)
- Memtable(在内存中数据保存在memtable,使用二叉搜索树实现、存储达到阈值后按顺序写入磁盘,弥补SSTables的缺陷)
索引实现
- 通过主键实现数据的顺序写入
- 针对主键构建主键索引
- 针对每列构建稀疏索引
- 通过mark的选择让主键索引可以定位到每一列的索引
- 通过多种手段(添加二级索引、建立Projection)优化非主键列的索引
总结
- ClickHouse是标准的列存结构
- 存储设计是LSM-Tree架构
- 使用稀疏索引加速查询
- 每列都有丰富的压缩算法和索引结构
- 基于列存设计的高效的数据处理结构