ClickHouse 的独特特性
真正的列式数据库管理系统
在真正的列式DBMS中,不会与值一起存储任何额外的数据。这意味着必须支持常量长度的值,以避免在值旁边存储其长度“数字”。例如,十亿个 UInt8 类型的值应该占用大约 1 GB 的未压缩数据,或者这会严重影响 CPU 使用率。即使在未压缩的情况下,也要紧凑地存储数据(没有任何“垃圾”),因为解压缩的速度(CPU 使用率)主要取决于未压缩数据的量。
这与可以将不同列的值分别存储但由于针对其他场景(如 HBase、BigTable、Cassandra 和 HyperTable)进行了优化而无法有效处理分析查询的系统形成对比。在这些系统中,您将获得大约每秒十万行的吞吐量,而不是每秒数亿行。
最后,ClickHouse 是一个数据库管理系统,而不是单个数据库。它允许在运行时创建表和数据库,加载数据并在不重新配置和重新启动服务器的情况下运行查询。
数据压缩
一些列式DBMS不使用数据压缩。但是,数据压缩在实现卓越性能方面发挥着关键作用。
除了具有不同磁盘空间和 CPU 消耗权衡的有效通用压缩编解码器之外,ClickHouse 还提供了 专门的编解码器 用于特定类型的数据,这使得 ClickHouse 能够与时序数据库等更利基的数据库竞争并胜过它们。
磁盘数据存储
根据主键物理排序数据,可以以低于几十毫秒的低延迟提取基于特定值或值范围的数据。一些列式DBMS(如 SAP HANA 和 Google PowerDrill)只能在 RAM 中工作。这种方法需要分配比实时分析所需的更大的硬件预算。
ClickHouse 旨在在普通硬盘驱动器上工作,这意味着每 GB 数据存储的成本较低,但如果可用,SSD 和额外的 RAM 也会被充分利用。
多核并行处理
大型查询自然地并行化,利用当前服务器上所有必要的可用资源。
多服务器分布式处理
上面提到的几乎所有列式DBMS都不支持分布式查询处理。
在 ClickHouse 中,数据可以驻留在不同的分片上。每个分片可以是一组用于容错的副本。所有分片都用于并行运行查询,对用户来说是透明的。
SQL 支持
ClickHouse 支持 SQL 语言,该语言与 ANSI SQL 标准大部分兼容。
支持的查询包括 GROUP BY、ORDER BY、FROM 中的子查询、JOIN 子句、IN 运算符、窗口函数 和标量子查询。
在撰写本文时,不支持相关(依赖)子查询,但将来可能会提供。
向量计算引擎
数据不仅按列存储,而且按向量(列的一部分)处理,这使得能够实现高 CPU 效率。
实时数据插入
ClickHouse 支持具有主键的表。为了快速执行主键范围的查询,数据使用合并树增量排序。因此,可以持续向表中添加数据。在引入新数据时不会获取锁。
主键索引
根据主键物理排序数据,可以以低于几十毫秒的低延迟提取基于特定值或值范围的数据。
二级索引
与其他数据库管理系统不同,ClickHouse 中的二级索引不会指向特定行或行范围。相反,它们允许数据库预先知道某些数据部分中的所有行都不会匹配查询过滤条件并且根本不读取它们,因此它们被称为 数据跳过索引。
适用于在线查询
大多数 OLAP 数据库管理系统并不针对亚秒级延迟的在线查询。在替代系统中,数十秒甚至数分钟的报表构建时间通常被认为是可以接受的。有时甚至需要更长的时间,这迫使系统离线准备报表(预先或通过响应“稍后再回来”)。
在 ClickHouse 中,“低延迟”意味着查询可以立即处理,无需延迟,并且无需尝试预先准备答案,就在用户界面页面加载的同时。换句话说,就是在线的。
支持近似计算
ClickHouse 提供多种方法来以牺牲准确性为代价来提高性能。
- 用于近似计算不同值的数量、中位数和分位数的聚合函数。
- 基于数据的一部分(样本)运行查询并获取近似结果。在这种情况下,从磁盘检索的数据量成比例地减少。
- 对有限数量的随机键运行聚合,而不是对所有键运行聚合。在数据中键分布的某些条件下,这提供了相当准确的结果,同时使用了更少的资源。
自适应连接算法
ClickHouse 自适应地选择如何 JOIN 多个表,优先使用哈希连接算法,如果有多个大表,则回退到合并连接算法。
数据复制和数据完整性支持
ClickHouse 使用异步多主复制。写入任何可用副本后,所有剩余副本将在后台检索其副本。系统在不同的副本上维护相同的数据。大多数故障后的恢复会自动执行,或者在复杂情况下半自动执行。
有关更多信息,请参阅 数据复制 部分。
基于角色的访问控制
ClickHouse 使用 SQL 查询实现用户帐户管理,并允许进行 基于角色的访问控制配置,类似于 ANSI SQL 标准和流行的关系数据库管理系统中可以找到的配置。
可以被视为缺点的功能
- 没有成熟的事务。
- 缺乏以高速度和低延迟修改或删除已插入数据的可能性。提供了批量删除和更新来清理或修改数据,例如,以符合 GDPR。
- 稀疏索引使得 ClickHouse 对按键检索单个行的点查询效率不高。