这是我参与「第五届青训营」笔记创作活动的第15天
1. 本节课重点内容
- 数据库基本概念
- 列式存储
- ClickHouse存储设计
2. 数据库基本概念
2.1 数据库的类型
2.1.1 关系型数据库
关系型数据库是吧数据以表的形式进行存储,然后再各个表之间建立关系,通过这些表之间的关系来操作不同表之间的数据
2.1.2 非关系型数据库
NoSql 或非关系数据库,支持存储和操作非结构化及半结构化数据。相比于关系型数据库,NoSql没有固定的表结构,且数据之间不存在表于表之间的关系,数据之间可以是独立的。
2.1.3 OLTP数据库
- 一种高速分析数据库,专为多个用户执行大量事务而设计
2.1.4 OLAP数据库
旨在同时分析多个数据维度,帮助团队更好的理解其数据中的复杂关系
- 大量数据的读写,PB级别的存储
- 多维分析,复杂的聚合函数
- 窗口函数,自定义UDF
- 离线/实时分析
2.2 SQL
一种编程语言,目前几乎所有的关系型数据库都使用sql
- 优点
- 标准化,ISO和ANSI是长期建立使用的SQL数据库标准
- 高度非过程化,用SQL进行数据操作,用户只需提出做什么,而不必指明怎样做,有利于提高数据独立性
- 语言简洁,易学易用
2.3 数据库架构
3.列式存储
3.1 行式存储
3.2 列式存储
3.2.1 列式存储的优点
- 数据压缩
- 数据压缩可以使读的数据量更少,在IO密集型计算机中获得更大的性能优势
- 相同类型压缩效率更高
- 排序之后压缩效率更高
- 可以针对不同类型使用不同的压缩算法
- 数据选择
- 可以选择特定的列做计算而不是所有的列
- 对聚合计算友好
- 延迟物化
- 将列数据转换为可以被计算或输出的行数据或者内存数据结果的过程
- 缓存友好
- cpu/内存带宽友好
- 可以利用到执行计划和算子的优化
- 保留直接压缩列做计算的机会
3.3 行存VS列存
4. ClickHouse存储设计
4.1 表定义和结构
4.2 集群架构
4.3 引擎架构
4.4 存储架构
4.5 索引设计
B-Tree
- 数据写入是有序的,支持增删查改
- 每个节点有多个孩子节点
- 每个节点都按照升序排列key值
- 每个key有两个指向左右孩子的引用
B+Tree
- 所有的数据都存储在叶子节点,非叶子节点只保存key值
- 叶子节点维护到相邻叶子节点的引用
- 可以通过key值做二分查找,也可以通过叶子节点做顺序访问
SSTables
- Key按顺序存储到文件中,称为segment
- 包含多个segment
- 每个segment写入磁盘后都是不可更改的,新加的数据只能生成新的segment
数据查询
- 需要从最新的segment开始遍历每个key
- 也可以为每个segment建一个索引