ClickHouse为何如此之快?

简介: 揭开ClickHouse的黑魔法

老板:"你听说过ClickHouse吗?简称叫CK!!!"

我:"听说过,不是个内裤品牌吗?谁没听说过?你想干什么?!!"

老板:"不是内裤!!是 CH !! 是一款OLAP数据库,给你看,这是它的测试报告"

我:"假的吧,单机性能就这么高?怎么可能!!!"

老板:"不信你自己试试!!"

一番捣鼓之后

我:"。。。。。。。"

颠覆三观、陷入无限思考,心中只有三个字:

这是什么鬼!!

上述是我的一段亲身经历。

很多初识CH的人,内心都会经历这么几个阶段:
相遇,会被它那惊叹的性能所吸引;
疑惑,开始质疑它的真实性;
困惑,在亲自论证了可靠性后,身体虽然是相信了,但内心依然觉得不可思议,不明就里。

于是乎,为什么ClickHouse这么快? 渐渐成了一个不解之谜。

作为一个拥有ClickHouse信仰标签的忠实粉丝,我自然也是追寻谜底的一份子。在我苦苦寻觅许久之后,今天,终于被我找到了答案。所以特地拿来与各位分享,谜底就在下面:

翻译过来的意思是:
这是纯魔法,是由前苏联科学家提供的技术.他们曾经用来制造火箭.

看到没?! 这就是ClickHouse的黑魔法。

好吧,这其实是我今天刚看到的一则笑话,来自于中科院计算所博士,郑天祺 (Amos Bird),同时他也是一名ClickHouse的Committer。

虽然刚才的谜底是假的,但疑问是真真切切存在的,为什么ClickHouse这么快?

已经有很多人,对这个问题做出过科学合理的解释。
比如有人说,因为ClickHouse是列存数据库,所以快;
也有人说,因为ClickHouse使用了向量化引擎,所以快。

这些解释都站得住脚,但是依然不能消除我的疑问。因为这些技术并不是秘密,世面上有很多数据库同样使用了这些技术,但是依然被ClickHouse秒杀呀?

所以,今天我想从另外一个角度,来探讨一下ClickHouse的黑魔法,它到底是什么。

要找到问题的谜底,其实有一个很简单的办法,那就是听听作者们自己是怎么说的呗。

画外音:"说的轻巧,去哪里找作者倾诉呢?"

所以说,勤奋的人们总是容易被幸运眷顾,你看这不:
恰好,在2019的年末,在北京举行了 中国大数据技术大会(BDTC 2019);
恰好又,这个大会邀请了 ClickHouse项目的创始人兼开源社区创始人,Alexey Milovidov
恰恰好又,Alexey Milovidov 在大会上做了一次主题分享;
恰恰恰好又,这个分享主题就叫做 The Secrets of ClickHouse Performance Optimizations

各位说说,怎么就这么巧呢?简直做梦都要笑醒的节奏啊。

既然作者已经做了分享,那我就从这次分享出发,对ClickHouse的黑魔法做一番分析总结吧。(文末会附上Alexey Milovidov的分享视频)

开篇伊始,Alexey Milovidov就抛出了一个灵魂的质问:

做设计的原则,到底应该是 自顶向下 的去设计,还是应该 自下而上 的去设计 ?

在传统观念中,或者说在我的观念中,自然是 自顶向下的,做架构设计首先自然做的是顶层设计:

  • 事先应该做高层次的抽象设计;
  • 规划好各个模块的职责、切分的界面;
  • 分配好工程结构、包结构,最好能再来一些设计图,等等。

而ClickHouse的设计,则采用了 自下而上

ClickHouse的原型系统早在2008年就诞生了(有机会可以专门写一篇,聊聊关于ClickHouse的诞生历程),
在诞生之初,它并没有宏伟的规划。相反,它的目的很单纯,就是希望能以最快的速度进行GROUP BY查询和过滤。

他们是如何实践 自下而上 设计的呢?

着眼硬件,先想后做

从硬件功能层面着手设计,在设计伊始,就至少需要想清楚这么几个问题:

  1. 我们将要使用的硬件水平是怎样的?包括CPU、内存、硬盘、网络等等;
  2. 在这样的硬件上,我们需要达到怎样的性能?包括延迟、吞吐量等等;
  3. 我们准备使用怎样的数据结构?包括String、HashTable、Vector等等;
  4. 选择的这些数据结构,在我们的硬件上会如何工作?

如果你能想清楚上面的问题,那么在动手实现功能之前,就已经能够计算出粗略的性能了。

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

所以别小看这些细节,一点一滴的将它们累加起来,数据是非常可观的。也正因为注意了这些细节,所以ClickHouse在基准查询中,能做到1.75亿/每秒的数据扫描性能。

算法在前,抽象在后

最近常听人念叨,"有时候,选择比努力更重要"。 确实,路线选错了,再努力也是白搭。

在ClickHouse的底层实现中,经常会面对这些场景:
字符串子串查询;
数组排序;
使用HashTable等。

如何才能在实现性能的最大化呢?算法的选择是重中之重!!!

以字符串为例,有一本专门讲解字符串搜索的书,叫做 "Handbook of Exact String Matching Algorithms",这本书列举了35种常见的字符串搜索算法,你猜ClickHouse使用了其中的哪一种?

一种都没用!! 为什么?因为性能不够快。

在字符串搜索方面,针对不同的场景,ClickHouse最终选择了这些算法:

对于常量,使用Volnitsky算法;
对于非常量,使用CPU的向量化执行SIMD,暴力优化;
正则匹配使用re2hyperscan算法。

勇于尝鲜,不行就换

除了字符串之外,其余的场景也与它类似,ClickHouse会使用最合适、最快的算法。
如果世面上出现了,号称性能强大的新算法,他也会将其纳入,进行验证。如果效果可行,就保留使用;如果性能不尽人意,就将其抛弃。

特定场景,特殊优化

针对在同一个场景的,不同的状况,选择使用不同的实现方式,尽可能的将性能最大化。关于这一点,其实在刚才介绍字符串查询时候,针对不同场景选择不同的算法就能体现了。
类似的例子还有很多,例如去重计数uniqCombined函数,根据数据量的不同会选择不同的算法。当数据量较小的时候,会选择Array保存;当数据量中等时候,则会选择HashSet;而当数据量很大的时候,则使用HyperLogLog算法。

包括对于数据结构比较清晰的场景,会通过代码生成技术,实现循环展开,以减少循环次数。

还包括大家熟知的大杀器,向量化执行了。SIMD被广泛的应用于文本转换、数据过滤、数据解压和JSON转换等场景。利用寄存器暴力优化,相较于单纯的使用CPU而言,也算是一种降维打击了。

持续测试,持续改进

如果只是单纯的,在上述的细节上下功夫,还不足以构建出如此强大的ClickHouse,这里还需要拥有一个能够持续验证、持续改进的机制。
由于Yandex的天然优势,ClickHouse经常会使用真实的数据做测试,这一点很好的保证了测试场景的真实性。于此同时,ClickHouse也是我见过发版速度最快的开源软件了,差不多每个月都能发布一个版本,没有一个可靠的持续集成环境,这一点也是做不到的。
也正因为拥有这样的发版频率,他们能够快速迭代、快速改进。

好了,上述这些,就是我对Alexey Milovidov这次分享的一些总结和个人理解了。

最后,就以ClickHouse的口号,作为结束吧:

The ClickHouse Style:

As efficient as possible

As fast as possible

正如口号所言,他们做到了。

所以,ClickHouse的黑魔法并不是一项单一的技术,而是一种自底向上的,追求极致性能的设计思路。

目录
相关文章
|
自然语言处理 监控 数据挖掘
【Flink】Flink中的窗口分析
【4月更文挑战第19天】【Flink】Flink中的窗口分析
|
8月前
|
存储 人工智能 分布式计算
阿里云 OpenLake:AI 时代的全模态、多引擎、一体化解决方案深度解析
阿里云徐晟详解OpenLake:构建全模态、多引擎、一体化智能数据体系,融合大数据与AI,支持湖仓一体、Agentic Data及AI搜索,助力企业降本增效、加速AI落地。(239字)
1086 2
阿里云 OpenLake:AI 时代的全模态、多引擎、一体化解决方案深度解析
|
8月前
|
人工智能 运维 安全
2026年阿里云GPU云服务器全解析:GPU卡规格、收费价格及使用场景指南
阿里云GPU云服务器(EGS)提供高性能、弹性可扩展的算力支持,覆盖模型训练、智能驾驶、图形渲染等全场景AI应用。2026年全新升级,涵盖T4、A10、V100、L20等多元GPU卡型,匹配不同算力需求。支持包年包月、按量付费、抢占式实例等多种计费模式,结合节省计划与智能调度,助力企业降本增效。广泛应用于大模型推理、计算机视觉、科学计算等领域,具备安全合规、高可用、易用性强、生态完善等核心优势,是企业数字化转型与AI创新的坚实底座。
|
10月前
|
存储 SQL 缓存
Delta Join:为超大规模流处理实现计算与历史数据解耦
Delta Join(FLIP-486)是Flink流式Join的范式革新,通过将计算与历史数据解耦,避免传统Join因存储全量状态导致的资源爆炸。它采用无状态查询机制,按需从Fluss或Paimon等外部存储获取数据,显著降低状态大小、Checkpoint时间及恢复成本。实测中消除50TB状态,资源消耗降10倍,CPU内存节省超80%,作业恢复提速87%。兼容标准SQL,自动优化转换,适用于高基数流式关联、实时审计等场景,标志着大规模流处理进入高效稳定新阶段。
385 0
|
SQL 存储 Apache
基于 Flink 进行增量批计算的探索与实践
本文整理自阿里云高级技术专家、Apache Flink PMC朱翥老师在Flink Forward Asia 2024的分享,内容分为三部分:背景介绍、工作介绍和总结展望。首先介绍了增量计算的定义及其与批计算、流计算的区别,阐述了增量计算的优势及典型需求场景,并解释了为何选择Flink进行增量计算。其次,详细描述了当前的工作进展,包括增量计算流程、执行计划生成、控制消费数据量级及执行进度记录恢复等关键技术点。最后,展示了增量计算的简单示例、性能测评结果,并对未来工作进行了规划。
1475 6
基于 Flink 进行增量批计算的探索与实践
|
人工智能 搜索推荐
PersonaCraft:首尔国立大学推出的单参考图像生成多身份全身图像技术
PersonaCraft是由首尔国立大学推出的创新技术,能够从单一参考图像生成多个人物的逼真全身图像。该技术结合了扩散模型和3D人类建模,有效处理人物间的遮挡问题,并支持用户自定义身体形状调整,为多人图像合成树立了新标准。
611 9
PersonaCraft:首尔国立大学推出的单参考图像生成多身份全身图像技术
|
Rust 监控 安全
【专栏】`ripgrep`(rg)是Linux下快速、内存高效的文本搜索工具,用Rust编写,支持PCRE2正则表达式
【4月更文挑战第28天】`ripgrep`(rg)是Linux下快速、内存高效的文本搜索工具,用Rust编写,支持PCRE2正则表达式。相比`grep`,它在处理大文件和复杂模式时更具优势。安装`rg`可通过软件包管理器,如在Debian系系统中使用`sudo apt install ripgrep`。基本用法包括简单搜索、递归搜索、忽略大小写、显示行号等。高级功能包括固定字符串搜索、多文件匹配、并行搜索、排除选项和区域搜索。适用于日志分析、代码审查等场景,是提升工作效率的利器。
3161 4
|
设计模式 Java 测试技术
分层设计:Service 层真的需要实现接口吗?
【8月更文挑战第4天】在软件开发领域,分层设计是一种广泛应用且高效的设计模式,它通过将系统划分为不同的逻辑层(如表现层、服务层、数据访问层等),来提高代码的可维护性、可扩展性和可测试性。其中,Service层作为业务逻辑处理的核心,其设计尤为重要。那么,Service层是否真的需要实现接口呢?这个问题值得我们深入探讨。
722 8
|
存储 分布式计算 Hadoop
ClickHouse(01)什么是ClickHouse,ClickHouse适用于什么场景
ClickHouse是一款高性能的列式存储OLAP数据库,由俄罗斯的Yandex公司开发,用于在线分析处理(OLAP)。它提供秒级大数据查询,适用于商业智能、广告流量等领域。ClickHouse速度快的原因包括列式存储、数据压缩、向量化执行和多线程分布式处理。然而,它不支持事务,不适合OLTP操作。相比Hadoop生态中的查询引擎,ClickHouse在大量数据查询上表现出色。一系列的文章详细介绍了ClickHouse的各个方面,包括安装、表引擎和使用场景。
3104 2
ClickHouse(01)什么是ClickHouse,ClickHouse适用于什么场景