0%

ClickHouse学习总结

ClickHouse是一个用于联机分析(OLAP, On-Line Analytical Processing)的列式数据库管理系统(DBMS)。来自于 2011 年在纳斯达克上市的俄罗斯本土搜索引擎企业Yandex公司,诞生之初就是为了服务Yandex公司自家的 Web 流量分析产品Yandex.Metrica,后来经过演变,逐渐形成为现在的ClickHouse,全称是:Click Stream, Data WareHouse。

ClickHouse的特点

  • 完整的DBMS功能支持
  • 列式存储
  • 数据压缩
  • 支持批量更新
  • 完善的SQL支持和函数
  • 支持高可用

ClickHouse性能

根据Yandex的内部测试结果,ClickHouse表现出了比同类可比较产品更优的性能。可以在这里查看具体的测试结果。

Gitlib

OLAP场景的关键特征

  • 大多数是读请求
  • 数据总是以相当大的批(> 1000 rows)进行写入
  • 不修改已添加的数据
  • 每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列
  • 宽表,即每个表包含着大量的列 较少的查询(通常每台服务器每秒数百个查询或更少)
  • 对于简单查询,允许延迟大约50毫秒
  • 列中的数据相对较小: 数字和短字符串(例如,每个URL 60个字节)
  • 处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)
  • 事务不是必须的
  • 对数据一致性要求低
  • 每一个查询除了一个大表外都很小 查询结果明显小于源数据,换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中

列式存储

对于存储而言,列式数据库总是将同一列的数据存储在一起,不同列的数据也总是分开存储。

数据目录

索引

数据库引擎

Ordinary,Dictionary, Memory, Lazy, MySQL,其实 Ordinary 是默认库引擎

  • Ordinary引擎:默认引擎,如果不指定数据库引擎创建的就是Ordinary数据库
  • Dictionary引擎: 此数据库会自动为所有数据字典创建表
  • Memory引擎: 所有数据只会保存在内存中,服务重启数据消失,该数据库引擎只能够创建 Memory 引擎表
  • MySQL引擎: 改引擎会自动拉取远端MySQL中的数据,并在该库下创建MySQL表引擎的数据表
  • Lazy延时引擎:在距最近一次访问间隔 expiration_time_in_seconds 时间段内,将表保存在内存中,仅适用于 Log 引擎表

表引擎

ClickHouse 的表引擎提供了四个系列(Log、MergeTree、Integration、Special)大约 28 种表引擎,各有各的用途。

Log 系列用来做小表数据分 析
MergeTree 系列用来做大数据量分析,
Integration 系列则多用于外表数据集成。
Log、Special、Integration 系列的表引擎相对来说,应用场景 有限,功能简单,应用特殊用途,MergeTree 系列表引擎又和两种特殊表引擎(Replicated,Distributed)正交形成多种具备不同功能的 MergeTree 表 引擎。

MergeTree

关于表引擎类型:
第一:MergeTree 表引擎主要用于海量数据分析,支持数据分区、存储有序、主键索引、稀疏索引、数据 TTL 等。MergeTree 支持所有 ClickHouse
SQL 语法,但是有些功能与 MySQL 并不一致,比如在 MergeTree 中主键并不用于去重。
第二:为了解决 MergeTree 相同主键无法去重的问题,ClickHouse 提供了 ReplacingMergeTree 引擎,用来做去重。ReplacingMergeTree 确保数据 最终被去重,但是无法保证查询过程中主键不重复。因为相同主键的数据可能被 shard 到不同的节点,但是 compaction 只能在一个节点中进行,而且 optimize 的时机也不确定。
第三:CollapsingMergeTree 引擎要求在建表语句中指定一个标记列 Sign(插入的时候指定为 1,删除的时候指定为 -1),后台 Compaction 时会将主 键相同、Sign 相反的行进行折叠,也即删除。来消除 ReplacingMergeTree 的限制。
第四:为了解决 CollapsingMergeTree 乱序写入情况下无法正常折叠问题,VersionedCollapsingMergeTree 表引擎在建表语句中新增了一列 Version,用于在乱序情况下记录状态行与取消行的对应关系。主键相同,且 Version 相同、Sign 相反的行,在 Compaction 时会被删除。
第五:ClickHouse 通过 SummingMergeTree 来支持对主键列进行预先聚合。在后台 Compaction 时,会将主键相同的多行进行 sum 求和,然后使用 一行数据取而代之,从而大幅度降低存储空间占用,提升聚合计算性能。
第六:AggregatingMergeTree 也是预先聚合引擎的一种,用于提升聚合计算的性能。与 SummingMergeTree 的区别在于:SummingMergeTree 对 非主键列进行 sum 聚合,而 AggregatingMergeTree 则可以指定各种聚合函数。

SQL

物化视图

工作原理

数据分区

列式存储

一级索引

二级索引

数据压缩

数据标记

查询数据流程