ClickHouse 为什么这么快

ClickHouse 作为一款开源列式数据库管理系统(DBMS)主要用于数据分析(OLAP)领域。

近年来国内开源社区非常火热,各个大厂纷纷跟进大规模使用。而提到 ClickHouse 最先想到的就是它极致的性能,计算速度开源公开 benchmark 显示比传统方法快 100~1000 倍,提供 50MB~200MB/s 的高吞吐实时导入能力。所谓“天下武功为快不破”,那 ClickHouse 到底是如何做到快速查询的呢?今天我们就来一起了解一下。

一、自下而上的设计

早在 2019 年年末,ClickHouse 项目的创始人兼开源社区创始人 — Alexey Milovidov,就在北京举行的中国大数据技术大会(BDTC 2019)上分享过自下而上的设计理念,那他们是如何实现这种设计的呢?

1. 着眼硬件,先想后做

从硬件功能层面着手设计,包括 CPU、内存、硬盘、网络等等,基于将硬件功效最大化的目的,ClickHouse 会在内存中进行 GROUP BY,并且使用 HashTable 装载数据。与此同时,他们非常在意 CPU L3 级别的缓存,因为一次 L3 cache miss 会带来 70~100 纳秒的延迟,这意味着,在单核 CPU 上,它会浪费 4000 万/每秒的运算;而在一个 32 线程的 CPU 上,则可能会浪费 5 亿/每秒的运算。

2. 算法在前,抽象在后

实现性能的最大化,算法的选择是重中之重。有时候,选择比努力更重要,以字符串搜索算法为例,针对不同的场景,ClickHouse 最终选择了这些算法:

  • 对于常量,使用 Volnitsky 算法;

  • 对于非常量,使用 CPU 的向量化执行 SIMD,暴力优化;

  • 正则匹配使用 re2 和 hyperscan 算法。

3. 特定场景,特殊优化

针对同一个场景的不同状况,使用不同的实现方式,尽可能地将性能最大化。例如去重计数 uniqCombined 函数,根据数据量的不同,会选择不同的实现方式:

  • 当数据量较小的时候,会选择 Array 保存;

  • 当数据量中等时候,则会选择 HashSet;

  • 而当数据量很大的时候,则使用 HyperLogLog 算法。

4. 勇于尝鲜,不行就换

除了字符串之外,在很多场景下 ClickHouse 会使用最合适、最快的算法。如果市面上出现了号称性能强大的新算法,ClickHouse 也会将其纳入并进行验证,如果效果可行,就保留使用。

5. 持续测试,持续改进

实践是检验真理的唯一标准,ClickHouse 还拥有一个能够持续验证、持续改进的机制。

由于 Yandex 的天然优势,ClickHouse 经常会使用真实的数据做测试,这一点很好地保证了测试场景的真实性。与此同时,ClickHouse 是发版速度非常快的开源软件了,每个月都至少能发布一个版本,这得力于一个可靠的持续集成环境。也正是因为拥有这样的发版频率,ClickHouse 才得以在快速迭代、快速改进中逐渐强大起来。

二、列式存储

ClickHouse 为什么这么快_第1张图片

相比于行式存储,列式存储在分析场景下有着许多优良的特性。

1)分析场景中往往需要读大量行但是少数几个列。在行存模式下,数据按行连续存储,所有列的数据都存储在一个 block 中,不参与计算的列在 IO 时也要全部读出,读取操作被严重放大。而列存模式下,只需要读取参与计算的列即可,极大地减低了 IO,加速了查询。

2)同一列中的数据属于同一类型,压缩效果显著。列存往往有着高达十倍甚至更高的压缩比,节省了大量的存储空间,降低了存储成本的同时,从磁盘中读取相应数据耗时也更短。

3࿰

你可能感兴趣的:(clickHouse,clickhouse,大数据,数据库)