ClickHouse快速了解

简介

ClickHouse是一个开源列式数据库管理系统(DBMS),用于在线分析处理(OLAP):

  1. 列式存储:与传统的行式数据库不同,ClickHouse以列的形式存储数据,这使得在分析大量数据时能够获得更好的性能和压缩率。

  2. 高速查询:ClickHouse为分析大量数据而优化,可以执行复杂的查询,并在极短的时间内提供答案。

  3. 分布式处理:ClickHouse可以无缝地在多个节点上部署,提供水平扩展。它支持复制、分片和负载均衡。

  4. 数据压缩:由于列式存储的特点,ClickHouse提供了高效的数据压缩,从而节省存储空间并提高查询速度。

  5. SQL支持:ClickHouse使用SQL作为查询语言,并提供了丰富的函数库,包括时间序列、聚合和字符串处理函数等。

  6. 实时处理:尽管ClickHouse主要是为OLAP场景设计的,但它还支持近实时数据插入和查询,使其在某些情况下也可用于在线事务处理(OLTP)。

  7. 开源与社区:ClickHouse是完全开源的,拥有一个活跃的开发和用户社区。

  8. 多种数据格式:ClickHouse支持多种数据格式,如Parquet、JSON、CSV等,这使得从其他系统迁移或导入数据变得非常容易。

  9. 与其他技术的集成:ClickHouse可以与多种其他技术(例如Kafka、HDFS等)集成,使其能够在各种环境中高效地工作。

ClickHouse快速了解_第1张图片

简而言之,CK本质上就是DBMS,起源于mysql,它重要特点就是:数据按列存储,适合于OLAP在线分析处理,查询列的速度非常之快,节省大量的IO资源。(其实和hudi有点像,hudi就是行写入、列查询)

同一列保存在同一个数据文件当中,便于数据的压缩存储

这一点很好理解,同一列的数据类型(域)是一致的,想想看是各种类型都有的一行数据好压缩,还是一列相同类型的数据好压缩?结果显而易见!

ClickHouse快速了解_第2张图片

ClickHouse快速了解_第3张图片

本质上,CK的数据类型和C++相似,因为CK就使用C++写的。


ClickHouse 与表函数

ClickHouse的强大表函数支持增强了其与其他系统的互操作性,为用户提供了更多的灵活性和方便性。涉及到DBMS和大数据框架的整合,使得数据处理和分析变得更加高效和无缝。

表函数 (Table Function)

表函数是一种数据库函数,它返回一个可以像操作常规数据库表那样操作的行集。其主要目的是能够将函数的输出作为一个表来使用。这意味着我们可以使用SQL查询来读取和处理这些函数的输出。

ClickHouse 与表函数

ClickHouse的特点之一是其广泛的表函数支持。这些表函数允许管理员用户从各种数据源(例如文件、URL、外部数据库、大数据框架等)读取数据,并将这些数据作为表来处理。例如,管理员用户可以使用表函数从一个文件或HTTP URL中读取数据,然后直接在ClickHouse中对该数据进行查询,而无需先导入数据。

DBMS 和大数据框架的整合

ClickHouse为了提高灵活性和扩展性,提供了与其他DBMS和大数据框架的整合功能。例如,ClickHouse可以与Kafka、HDFS、MySQL等进行交互。表函数在这方面发挥了关键作用,它们使得从这些系统中读取数据变得异常简单。通过表函数,ClickHouse可以轻松地与其他系统进行交互,从而实现数据的即时查询和分析,而无需事先进行数据迁移或转换。


CK存储引擎及Primary Key

CK使用了一种名为MergeTree的数据结构和存储引擎:

ClickHouse快速了解_第4张图片

  1. MergeTree存储引擎:

    • 数据结构: MergeTree实际上是一系列的有序块。每个块内部的数据都是按照某种键(通常是PRIMARY KEY)排序的
    • 合并操作: 名为“MergeTree”的原因是因为它定期将这些块合并为更大的块,这在后台自动完成。这种合并操作有助于数据的压缩和查询优化。
    • 插入速度与查询优化: 由于数据是分块插入的,并且每个块内部的数据都是有序的,这使得插入速度很快,并且查询可以高效地进行,因为数据库知道在哪里查找数据。
  2. PRIMARY KEY in ClickHouse:

    • 排序: 在ClickHouse中,PRIMARY KEY定义了数据的物理排序方式。当查询数据时,ClickHouse会使用这个排序信息来跳过那些不相关的数据块。
    • 不是唯一的: 与MySQL不同,ClickHouse中的PRIMARY KEY不保证唯一性。它只是一个排序和索引工具。
  3. 为什么与MySQL中的PRIMARY KEY不同:

    • 目的不同: MySQL(以及其他传统的关系型数据库)中的PRIMARY KEY主要用于确保数据的唯一性和引用完整性。而ClickHouse的设计目标是查询速度和分析,所以PRIMARY KEY在ClickHouse中主要用于数据排序和查询优化。
    • 数据模型: 由于ClickHouse是为OLAP场景设计的,它的数据模型与为在线事务处理(OLTP)设计的MySQL有所不同。在OLAP场景中,大量的数据聚合和分析比数据的唯一性更为重要。

让我们通过CK中的块,进一步了解CK的主键:

  1. 块之间的顺序:

    • 在ClickHouse中,块的创建是基于插入的数据批次的,每批数据在插入时都会形成新的块,并按照PRIMARY KEY进行排序。所以块之间不必然存在严格的顺序。但由于合并操作,较小的块可能会在后台被合并成较大的块,以提高效率和压缩数据。
    • 当你在ClickHouse中执行一个批量的数据插入时,数据会首先被缓存并排序,然后在达到一定大小或时间阈值后被刷入磁盘。这种批量写入方法有助于提高写入的吞吐量,减少磁盘I/O操作,从而提高整体性能。
  2. 块合并:

    ClickHouse的合并操作基于MergeTree家族中特定的表引擎策略。通常,合并操作考虑块的大小、块的年龄、数据的修改历史等因素。块合并也有助于清除数据的过时版本,因为ClickHouse支持数据的版本控制。

  3. 块的数据结构:

    从物理视角看,块是一批列式存储的数据页。这意味着每列的数据都连续存储,而不是行式存储。这种列式存储结构优化了分析查询的性能,因为通常分析查询只涉及表中的少数列。

  4. MySQL的聚集索引与ClickHouse的PRIMARY KEY:

    • MySQL中的聚集索引确实按照PRIMARY KEY来存储数据。但ClickHouse和MySQL的设计目标和使用场景有所不同。ClickHouse是为大数据分析优化的,而MySQL则更倾向于在线事务处理。
    • MySQL中,PRIMARY KEY确保了唯一性,这对于事务性操作是很有价值的,因为你经常需要基于唯一键来更新或删除特定的记录。而在ClickHouse中,数据通常是以批次写入并追加的方式插入的,而不是单行的插入、更新或删除。
    • ClickHouse中改变PRIMARY KEY的意义,是为了更好地服务于它的主要用例:大数据分析。PRIMARY KEY更多地作为一个优化查询性能的工具,而不是作为一个确保数据完整性的约束。

再理解二者PK的区别:

MySQL的PRIMARY KEY(聚集索引)和ClickHouse的PRIMARY KEY都能实现数据跳过和减少存储需求的效果,但它们是为了不同的工作负载而优化的。

  1. 数据跳过:MySQL的聚集索引确实允许它快速查找特定的行。但在大规模数据分析中,你经常需要处理大范围的数据,而不是单独的行。ClickHouse的PRIMARY KEY是为了这种查询模式设计的,它可以让系统判断哪些数据块是与查询条件无关的,从而跳过大量数据。

  2. 减少存储需求:虽然MySQL的聚集索引也按PRIMARY KEY排序存储数据,但由于它的行式存储模式,压缩效果不及ClickHouse。ClickHouse的列式存储结合数据排序可以实现更高效的数据压缩。

可以这么理解:MySQL的PRIMARY KEY是全能型设计,旨在优化随机访问和事务性查询。而ClickHouse的PRIMARY KEY是专攻型设计,特别优化了大数据分析的工作负载。


总结

ClickHouse是一个高性能的分析数据库,适合实时或近实时的大数据查询。如果我们的目标是进行高速分析和查询,而不仅仅是数据存储和同步,那么使用ClickHouse可能会有帮助。我们可以将数据从数据库同步到ClickHouse,并使用ClickHouse的强大查询能力进行分析。

然而,如果只需要数据存储和简单的查询功能,直接使用Mysql / Hudi可能更加简洁和高效。只有需要高速、复杂的实时查询时,考虑使用ClickHouse。

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