ClickHouse 为什么如此快速?
它被设计为快速。在开发过程中,查询执行性能始终是重中之重,但也考虑了其他重要特性,如用户友好性、可扩展性和安全性,以便 ClickHouse 能够成为真正的生产系统。
"构建速度",Alexey Milovidov(ClickHouse 首席技术官)
"构建速度" 来自 2022 年 6 月 ClickHouse 阿姆斯特丹会议的演讲。
"ClickHouse 性能优化的秘诀" 来自 2019 年 12 月大数据技术大会的演讲,从更技术的角度探讨了相同主题。
是什么让 ClickHouse 如此快速?
架构选择
ClickHouse 最初被构建为一个原型,只为了做好一项任务:尽可能快地过滤和聚合数据。构建典型的分析报告需要执行此操作,而典型的 GROUP BY 查询就是这么做的。ClickHouse 团队做出了一些高级决策,这些决策结合在一起,使得完成此任务成为可能。
**列式存储:**源数据通常包含数百甚至数千列,而报告可能只使用其中几列。系统需要避免读取不必要的列,以避免代价高昂的磁盘读取操作。
**索引:**内存驻留的 ClickHouse 数据结构允许仅读取必要的列,以及这些列中仅必要的行范围。
**数据压缩:**将同一列的不同值存储在一起通常会导致更好的压缩率(与面向行的系统相比),因为在实际数据中,同一列对于相邻行的值通常相同或差别不大。除了通用压缩之外,ClickHouse 还支持 专用编解码器,可以使数据更加紧凑。
**向量化查询执行:**ClickHouse 不仅以列的形式存储数据,还以列的形式处理数据。这可以提高 CPU 缓存利用率,并允许使用 SIMD CPU 指令。
**可扩展性:**ClickHouse 可以利用所有可用的 CPU 内核和磁盘来执行单个查询。不仅在单个服务器上,而且在整个集群的所有 CPU 内核和磁盘上。
关注底层细节
但是许多其他数据库管理系统也使用类似的技术。真正让 ClickHouse 脱颖而出的是**关注底层细节**。大多数编程语言都提供了大多数常用算法和数据结构的实现,但这些实现往往过于通用,无法有效。每个任务都可以被视为具有各种特征的场景,而不是仅仅使用随机实现。例如,如果您需要哈希表,以下是一些需要考虑的关键问题
- 选择哪个哈希函数?
- 冲突解决算法:开放寻址 与 链接?
- 内存布局:键和值使用一个数组还是分别使用数组?它会存储小值还是大值?
- 填充因子:何时以及如何调整大小?如何在调整大小时移动值?
- 值是否会被删除,如果会被删除,哪个算法会更好?
- 是否需要使用位图进行快速探测、字符串键的内联放置、对不可移动值的支持、预取和批处理?
哈希表是 GROUP BY
实现的关键数据结构,ClickHouse 会为每个特定的查询自动选择 30 多种变体 之一。
算法也是如此,例如,在排序时,您可能会考虑
- 将要排序的是什么:数字、元组、字符串还是结构的数组?
- 所有数据是否完全在 RAM 中可用?
- 是否需要稳定排序?
- 是否需要完全排序?也许部分排序或第 n 个元素就足够了?
- 如何实现比较?
- 我们是否正在排序已经部分排序过的数据?
依赖于其工作数据特征的算法通常比其通用对应算法表现更好。如果事先并不知道,系统可以尝试各种实现,并在运行时选择效果最好的那个。例如,请参阅 一篇关于 ClickHouse 中如何实现 LZ4 解压缩的文章。
最后但并非最不重要的一点是,ClickHouse 团队始终关注互联网上那些声称他们想出了最佳实现、算法或数据结构来完成某件事的人,并尝试使用这些方法。这些说法大多被证明是错误的,但偶尔您确实会找到一块瑰宝。
- 在设计系统时牢记底层细节。
- 基于硬件功能进行设计。
- 根据任务需求选择数据结构和抽象。
- 为特殊情况提供专门化。
- 尝试您昨天读到的新的“最佳”算法。
- 根据统计信息在运行时选择算法。
- 在真实数据集上进行基准测试。
- 在 CI 中测试性能回归。
- 测量和观察一切。
VLDB 2024 论文
2024 年 8 月,我们的第一篇研究论文被 VLDB 接收并发表。VLDB 是一个关于超大型数据库的国际会议,被广泛认为是数据管理领域领先的会议之一。在数百篇提交的论文中,VLDB 的接受率通常约为 20%。
您可以阅读 论文的 PDF,其中简要描述了 ClickHouse 最有趣的架构和系统设计组件,这些组件使其如此快速。
我们的首席技术官兼 ClickHouse 创建者 Alexey Milovidov 发表了这篇论文(幻灯片 在这里),随后进行了问答环节(很快就结束了!)。您可以在此处观看录制的演示文稿