ClickHouse | 青训营笔记

109 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 18 天

ClickHouse

数据库分类

根据使用场景

OLTP数据库:高速分析数据库,专为多个用户执行大量事务而设计

OLAP数据库:旨在同时分析多个数据维度,帮助团队更好的理解其数据中的复杂关系

OLAP数据库提供的功能

  1. 大量读写、PB级别存储
  2. 多维分析、复杂的聚合函数
  3. 窗口函数、自定义UDF
  4. 离线/实时分析

SQL优点

  1. 标准化、ISO、ANSI是长期建立使用的SQL标准
  2. 高度非过程化,用户只需提出做什么,无需了解存取路径,其他由系统自动完成,减轻用户负担,提高数据库独立性
  3. 提供两种使用方式,一个是直接在终端输入SQL命令,另一种是嵌入到高级语言中,比如java、c等等
  4. 语言简洁、易学易用

行存VS列存

行存列存
优点数据被保护在一起查询时只有涉及到的列会被读取
投影很高效
INSERT/UPDATE容易任何列都能作为索引
便于做延迟物化和向量化计算
压缩效率高,每一列可以使用不同的压缩算法
缺点选择时即使只涉及某几列,所有的数据也都会被读取选择完成时,被选择的列要重新组装
INSERT/UPDATE比较麻烦
点查询不适合
适用场景点查询统计分析类查询(OLAP)
增删改操作多即时查询

索引设计

传统数据库

Hash Index

  1. 将输入的Key通过一个HashFunction映射到一组bucket上
  2. 每个bucket都包含一个指向一条记录的地址
  3. 哈希索引在查找的时候只适用于等值比较

B-Tree

  1. 数据写入是有序的,支持增删查改

  2. 每个节点有多个孩子节点

  3. 每个节点都按照升序排列key值

  4. 每个key有两个指向左右孩子节点的引用

    1. 左孩子节点保存的key都小于当前key
    2. 右孩子节点保存的key都大于当前key

B+Tree

  1. 所有的数据都存储在叶子节点,非叶子节点只保存key值
  2. 叶子节点维护到相邻叶子节点的引用
  3. 可以通过key值做二分查找,也可以通过叶子节点做顺序访问

ClickHouse数据库

LSM-Tree

专为大吞吐写入场景设计的数据结构

  1. 着重优化顺序写入

  2. 主要数据结构

    1. SSTables(key按顺序存储到文件中,称为segment,写入磁盘后不可更改,只能删除重新写入)
    2. Memtable(在内存中数据保存在memtable,使用二叉搜索树实现、存储达到阈值后按顺序写入磁盘,弥补SSTables的缺陷)

索引实现

  1. 通过主键实现数据的顺序写入
  2. 针对主键构建主键索引
  3. 针对每列构建稀疏索引
  4. 通过mark的选择让主键索引可以定位到每一列的索引
  5. 通过多种手段(添加二级索引、建立Projection)优化非主键列的索引

总结

  1. ClickHouse是标准的列存结构
  2. 存储设计是LSM-Tree架构
  3. 使用稀疏索引加速查询
  4. 每列都有丰富的压缩算法和索引结构
  5. 基于列存设计的高效的数据处理结构