当前位置: 首页 > 后端技术 > Java

【Clickhouse专栏】clickhouse性能为何如此优秀

时间:2023-04-02 01:28:40 Java

上一篇《clickhouse专栏》《数据库、数据仓库之间的区别与联系》介绍了什么是数据库,什么是数据仓库,以及两者的区别。Clickhouse的定位是“数据仓库”,所以在了解了上一篇的内容之后,其实可以知道clickhouse适合哪些应用场景,不适合哪些应用场景。下面这一节,我们将继续介绍clickhouse的一些非常有意义的特性,帮助大家更好地理解ck的应用场景,以及为什么它被称为“性能怪兽”。[TOC]1.列式数据存储clickhouse的性能是其列式存储设计的最重要原因之一。举个例子,如果我们现在有一张学生信息表studentidnameage1Xiaohong72Xiaoming83lucy7,如果这张表采用行数据存储,那么它在磁盘上的结构是这样的:如果这张表是列数据存储,那么它在磁盘上的结构是这样的:比较上面两张图,我们可以看出使用列式存储的优势。比如我们查询学生年龄的最大值,列式数据存储只需要定位到年龄列的起始地址,然后依次读取数据进行排序计算即可。在基于行的数据存储方式中,由于年龄字段的数据单元不连续,需要根据索引连续寻址,或者扫描全表获取所有年龄数据。因此,在使用列式存储时,我们需要对某一列进行查询和过滤,统计计算的性能远优于行式数据存储。另外,由于数据库设计的列中的数据通常是相同的数据类型,列式数据存储的压缩比是行式存储的10倍以上,节省了大量的磁盘和内存空间,可以有效地降低服务器成本。2、支持SQL,性能优异目前,开源界的列式存储数据库,大多不支持SQL。即使很多号称支持SQL,其实支持SQL都是伪SQL,支持能力有限。但经过笔者的实验,clikhouse对标准SQL的支持与传统关系型数据库不相上下。虽然对于数据仓库clickhouse,我推荐大家使用宽表进行数据存储,但是不代表ck不具备多表关系查询的能力。可以访问:https://clickhouse.com/benchm...获取clickhouse对各种统计SQL的官方在线性能对比。3、分布式分片存储集群clikhouse不仅支持单机模式,还支持集群模式的分布式分片数据存储。数据以分片行的形式存储在多个服务器节点上,因此ck可以利用集群服务器的大规模计算能力,快速响应数据的统计结果。ck数据分片和分布式存储的机制使得clickhouse具备水平扩展和海量数据分析处理的能力。数据分片包括多种方式,比如:数据随机写入不同服务器分片存储,数据发送到指定服务器分片存储,数据根据哈希值分片,当然我们也可以自定义分片的数据分片方式。分布式数据存储将数据分发到集群中的各个服务器(以分片行的形式存在)。为了保证数据安全,每个分片都有多个副本,副本也是分布式存储的,这样即使部分服务器宕机,仍然可以保证ck集群的可用性。4.支持顺序存储不同于传统的RMDB数据库,clickhouse支持在建表时通过sortby关键字指定排序字段。这样,当数据入表时,实际上是先进行了排序操作,将按照排序字段排序的数据有序存储。在进行数据查询、过滤和统计时,可以有效快速的获取连续数据块中的数据,提高查询统计的性能。这种顺序存储的特性其实有着非常广泛的应用场景。例如,股票K线图是按照交易日的时间排序的。预设的排序字段和顺序存储有效地提高了统计性能。5、支持数据TTL在数据统计分析的数据库中,我们通常需要数据TTL能力,即:一些数据在达到一定的存储期限后会被自动删除。ck提供了该能力,降低了系统运维人员的工作难度。ck支持以下粒度的TTL列级TTL:为一个列设置TTL时间,当该列的某些数据过期时,该列的值将自动替换为默认值,并且该列在全部删除后自动删除数据过期。行级TTL:设置一行的TTL时间。当一行过期时,该行将被直接删除。分区级别的TTL:ck支持数据分区并设置TTL时间。当分区过期时,该分区将被直接删除。推荐阅读限于博文篇幅,更多精彩内容我就不一一列举了,推荐阅读《原创精品视频及配套文档:springboot-已录制97节(免费)》等。