ClickHouse高性能的底层设计
在设计软件架构的时候,大部分技术组件都采用自上而下的设计思路,而ClickHouse则采用了自下而上的设计方式,ClickHouse就是希望能以最快的速度进行group by查询和过滤。
1.硬件才是硬道理
能用钱解决的问题,千万别花时间。能用硬件解决的问题,千万别优化程序。
首先从硬件功能层面着手设计ClickHouse,需要考虑硬件水平(CPU、内存、磁盘、网络等)和数据结构(String、HashTable、Vector等)。
为了让硬件的功效最大化,ClickHouse会在内存中进行group by操作,并且使用HashTable装载数据,同时非常主要CPU L3级别的缓存使用。
ClickHouse就是在每个环节、细节使用最优方式,逐步积累,才达到非常惊人的性能,ClickHouse在基本查询中能做到1.75亿次/秒的数据扫描性能。
2.算法是重中之重
在ClickHouse的底层实现中,经常面对一些应用场景,如字符串查询、数组排序等,选择合适的算法,才能实现性能的最大化。
在字符串搜索方面,ClickHouse针对不同的应用场景,选择不同的算法:
对于常量字符串查询,使用volnitsky算法。
对于非常量字符串,使用CPU的向量化执行SIMD,进行暴力优化。
对于字符串正则匹配,使用re2和hyperscan算法。
总结:性能是算法选择的首要考量的指标
3.任人唯贤,优中选优
除了字符串之外,其余的应用场景也类似,ClickHouse会使用最适合、最快的算法。一旦有性能强大的新的算法出现,ClickHouse会进行验证,择优保留使用。
4.具体问题,具体分析
针对同一个应用场景的不同情况,可以选择不同的实现方式,尽可能将性能最大化。例如去重计数函数uniqCombined函数,会根据数据量的不同选择不同的算法:
当数据量较小的时候,会选择Array保存。
当数据量中等的时候,会选择HashSet保存。
当数据量很大的时候,则使用HyperLogLog算法。
对于文本转换,数据过滤,数据压缩,Json转换,可以使用必杀器 向量化执行。
5.不断测试,持续改进
构建出如此强大的ClickHouse,还需要拥有一个能够持续验证、持续改进的机制。由于Yandex数据量比较大,ClickHouse经常会使用真实的数据进行测试,这一点很好地保证了测试场景的真实性。正是有如此可靠的持续集成环境,ClickHouse才能够持续测试,快速迭代,快速改进。
ClickHouse不是一项单一的技术,而是一种自底向上的,追求极致性能的设计思路,这就是ClickHouse如此之快的秘诀。
原文链接:https://blog.csdn.net/dajiangtai007/article/details/126018331
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




