【基础篇】ClickHouse 表引擎详解

文章目录

  • 0. 引言
  • 1. 什么是表引擎
  • 2. 不同表引擎使用场景
      • 1. MergeTree:
      • 2. Log:
      • 3. Memory:
      • 4. Distributed:
      • 5. Kafka:
      • 6. MaterializedView:
      • 7. File和URL:
  • 3. MergeTree 家族
      • 3.1. MergeTree:
      • 3.2. ReplacingMergeTree:
      • 3.3. SummingMergeTree:
      • 3.4. AggregatingMergeTree:
      • 3.5. CollapsingMergeTree:
      • 3.6. VersionedCollapsingMergeTree:
  • 4. Log 家族
      • 4.1. TinyLog:
      • 4.2. StripeLog:
      • 4.3. Log:
    • 5. Memory 和 File 家族
      • 5.1. Memory:
      • 5.1.2. File:
  • 6. Null 家族
  • 7. 外部数据表引擎(MySQL, HDFS, URL, etc.)
      • 7.1. MySQL:
      • 7.2. HDFS:
      • 7.3. URL:
  • 引擎类型
    • MergeTree {#mergetree}
    • 日志
    • 集成引擎 {#integration-engines}
    • 用于其他特定功能的引擎 {#yong-yu-qi-ta-te-ding-gong-neng-de-yin-qing}
  • 虚拟列
  • 参考文档

在这里插入图片描述

0. 引言

ClickHouse的一大特性就是其表引擎,表引擎决定了如何存储数据,以及如何处理对数据的读写操作。在ClickHouse中,每张表都由一个表引擎支持,而且在创建表的时候就需要指定其表引擎

ClickHouse有很多类型的表引擎,包括基于磁盘存储的表引擎如MergeTree系列(MergeTree、ReplacingMergeTree、SummingMergeTree等)、Log系列(TinyLog、StripedLog、Log)等,也有基于内存存储的表引擎如Memory。每种表引擎都有其适用的场景和特性,例如,MergeTree系列是最常用的表引擎,适用于大量数据的存储和分析,而Memory引擎则适用于存储少量临时数据。

了解和选择合适的表引擎是使用ClickHouse进行高效数据分析的关键。接下来,我们将详细介绍各种类型的表引擎,以及它们的应用场景和限制。

1. 什么是表引擎

表引擎(Table Engine)是一种数据库管理系统中的关键部分,负责存储数据、读取数据和处理数据查询。不同的表引擎具有不同的性能特性和适用范围。

在某些数据库系统中,例如MySQL,你可以为每个表选择不同的表引擎,包括InnoDB,MyISAM,Memory等。这些表引擎在功能、性能、并发能力、恢复能力等方面都有所不同。

在ClickHouse中,表引擎的选择将影响数据的存储格式、索引的使用、并发控制机制、是否支持数据复制等许多重要的方面。

表引擎(即表的类型)决定了什么

  • 数据的存储方式和位置,写到哪里以及从哪里读取数据
  • 支持哪些查询以及如何支持。
  • 并发数据访问。
  • 索引的使用(如果存在)。
  • 是否可以执行多线程请求。
  • 数据复制参数。

2. 不同表引擎使用场景

1. MergeTree:

说明:MergeTree是ClickHouse的主要表引擎,支持索引和数据分区,适用于大数据计算。

使用场景:适用于大数据分析,如用户行为分析、日志分析等。

示例:

CREATE TABLE example_merge_tree
(date Date,id UInt32,value String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

2. Log:

说明:Log表引擎用于存储日志和其他机器数据。不支持索引和数据分区。

使用场景:适用于小数据量的日志和其他机器数据的存储。

示例:

CREATE TABLE example_log
(event_time DateTime,event_type String,event_data String
) ENGINE = Log;

3. Memory:

说明:Memory表引擎将所有数据存储在RAM中,适用于临时表和小数据量。

使用场景:适用于需要快速访问和计算的小数据量场景。

示例:

CREATE TABLE example_memory
(key UInt32,value String
) ENGINE = Memory;

4. Distributed:

说明:Distributed表引擎用于在多个节点间分布查询和数据。它自动分发查询和数据到所有节点。

使用场景:适用于需要在多个节点间进行数据分析的分布式场景。

示例:

CREATE TABLE example_distributed
(date Date,id UInt32,value String
) ENGINE = Distributed('my_cluster', 'my_database', 'example_merge_tree', rand());

5. Kafka:

说明:Kafka表引擎用于和Kafka集成,可用于实时数据流处理。

使用场景:适用于实时数据处理,如日志实时处理、实时数据分析等。

示例:

CREATE TABLE example_kafka
(event_time DateTime,event_type String,event_data String
) ENGINE = Kafka()
SETTINGSkafka_broker_list = 'localhost:9092',kafka_topic_list = 'test_topic',kafka_group_name = 'test_group',kafka_format = 'JSONEachRow',kafka_num_consumers = 2;

6. MaterializedView:

说明:MaterializedView引擎用于预处理数据,可以提高查询性能。

使用场景:适用于需要对大数据进行预处理以提高查询性能的场景。

示例:

CREATE MATERIALIZED VIEW example_mv
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
AS
SELECTdate,id,count() AS count
FROM example_merge_tree
GROUP BY date, id;

7. File和URL:

说明:File和URL表引擎用于对文件进行操作,例如CSV、Parquet等。

使用场景:适用于需要对文件进行操作的场景,如ETL操作、数据导入导出等。

示例:

CREATE TABLE example_file
(id UInt32,value String
) ENGINE = File(CSV, '/path/to/your/csv_file.csv');CREATE TABLE example_url
(id UInt32,value String
) ENGINE = URL('http://example.com/data.csv', CSV);

3. MergeTree 家族

ClickHouse的MergeTree家族引擎是一组支持实时数据更新、查询和数据合并功能的表引擎。这些引擎为大数据场景提供了高性能的解决方案。以下是MergeTree家族的主要成员及其使用场景。
MergeTree家族引擎根据不同的业务场景提供了多种实时数据处理功能,为大数据场景下的实时计算提供了强大的支持。在进行数据建模时,可以根据具体需求选择合适的MergeTree引擎。

3.1. MergeTree:

说明:MergeTree是ClickHouse的基本表引擎,支持索引和数据分区。

使用场景:适用于大数据分析,如用户行为分析、日志分析等。

示例:

CREATE TABLE example_merge_tree
(date Date,id UInt32,value String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

3.2. ReplacingMergeTree:

说明:ReplacingMergeTree用于实时删除重复数据。当合并过程中发现相同的主键数据时,只保留最新的一条记录。

使用场景:适用于需要实时删除重复数据的场景,如实时去重、数据清洗等。

示例:

CREATE TABLE example_replacing_merge_tree
(date Date,id UInt32,value String
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

3.3. SummingMergeTree:

说明:SummingMergeTree用于实时对数值型字段进行求和。在合并过程中,具有相同主键的记录将被合并为一条记录,并对指定字段求和。

使用场景:适用于需要对数值型字段进行实时求和的场景,如计数器、流量统计等。

示例:

CREATE TABLE example_summing_merge_tree
(date Date,id UInt32,value UInt32
) ENGINE = SummingMergeTree(value)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

3.4. AggregatingMergeTree:

说明:AggregatingMergeTree用于实时对数据进行聚合。在合并过程中,具有相同主键的记录将被聚合为一条记录,根据指定的聚合函数进行计算。

使用场景:适用于需要实时聚合数据的场景,如统计、报表等。

示例:

CREATE TABLE example_aggregating_merge_tree
(date Date,id UInt32,value UInt32,countState AggregateFunction(count)
) ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

3.5. CollapsingMergeTree:

说明:CollapsingMergeTree用于实时删除重复数据。不同于ReplacingMergeTree,它使用一个名为Sign的列来表示记录的状态(1表示插入,-1表示删除)。在合并过程中,符号相反且其他列相同的记录会被抵消。

使用场景:适用于需要实时删除重复数据的场景,如数据同步、状态更新等。

示例:

CREATE TABLE example_collapsing_merge_tree
(date Date,id UInt32,value String,sign Int8
) ENGINE = CollapsingMergeTree(sign)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

3.6. VersionedCollapsingMergeTree:

说明:VersionedCollapsingMergeTree与CollapsingMergeTree类似,但它还使用一个名为Version的列来表示记录的版本。在合并过程中,版本较新的记录会覆盖版本较旧的记录。

使用场景:适用于需要实时删除重复数据并支持版本控制的场景,如数据历史记录、状态更新等。

示例:

CREATE TABLE example_versioned_collapsing_merge_tree
(date Date,id UInt32,value String,sign Int8,version UInt32
) ENGINE = VersionedCollapsingMergeTree(sign, version)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;

4. Log 家族

ClickHouse的Log家族引擎是一组专门用于大数据日志处理的表引擎。这些引擎能够快速地处理大量日志数据,并以极高的性能对其进行查询。以下是Log家族的主要成员及其使用场景。

4.1. TinyLog:

说明:TinyLog是一种非常简单的引擎,它将所有列保存在一个文件中。不支持索引,所以查询速度较慢,但是插入速度快。

使用场景:适用于小型数据集和日志记录。

示例:

CREATE TABLE example_tinylog
(date Date,id UInt32,value String
) ENGINE = TinyLog;

4.2. StripeLog:

说明:StripeLog在存储结构上类似于TinyLog,但是数据分为几个部分(stripes)进行存储,每个stripe对应一个块(block)。不支持索引。

使用场景:适用于较大的日志记录。

示例:

CREATE TABLE example_stripelog
(date Date,id UInt32,value String
) ENGINE = StripeLog;

4.3. Log:

说明:Log是一种简单的引擎,它把每一列的数据分别存储在不同的文件中。不支持索引,适用于大量的日志数据。

使用场景:适合大量的日志记录和流数据。

示例:

CREATE TABLE example_log
(date Date,id UInt32,value String
) ENGINE = Log;

总结:Log家族引擎特别适合处理大量的日志数据,能够以极高的效率插入和查询数据。但是由于这些引擎不支持索引,所以查询性能会比MergeTree家族的引擎要差一些。在进行数据建模时,可以根据数据量和查询需求选择合适的Log引擎。

5. Memory 和 File 家族

ClickHouse中的Memory和File家族引擎分别用于在内存和文件系统中存储数据。以下是Memory和File家族的主要成员及其使用场景。

5.1. Memory:

说明:Memory引擎将所有数据存储在内存中。它支持实时查询,并且具有极高的查询速度。但是,由于它将所有数据保存在内存中,因此在服务器重启或崩溃时,数据会丢失。

使用场景:适用于需要快速查询的小型数据集,如缓存、临时表或实时分析。

示例:

CREATE TABLE example_memory
(date Date,id UInt32,value String
) ENGINE = Memory;

5.1.2. File:

说明:File引擎将数据保存在服务器的文件系统中。它支持将数据存储为各种文件格式(如CSV、Parquet、JSON等)。File引擎不支持索引,因此查询速度较慢。

使用场景:适用于需要将数据以特定文件格式存储的场景,如ETL操作、数据备份或离线分析。

示例:

CREATE TABLE example_file
(date Date,id UInt32,value String
) ENGINE = File(CSV);

总结:Memory和File家族引擎分别用于内存和文件系统中的数据存储。Memory引擎具有非常高的查询速度,适用于实时查询,但数据在服务器重启或崩溃时会丢失。File引擎适用于需要将数据存储为特定文件格式的场景,但查询速度较慢。在进行数据建模时,可以根据数据存储需求和查询需求选择合适的Memory或File引擎。

6. Null 家族

Null家族是ClickHouse中的一个特殊的表引擎家族,它基本上不会执行任何操作或存储任何数据。以下是Null家族的主要成员及其使用场景:

  1. Null:

说明:Null引擎不保存数据,并且不对数据进行任何操作。当你往这个表里面插入数据时,数据会被直接丢弃。对于从这个表中的查询,它总是返回一个空结果。

使用场景:Null引擎主要用于调试或测试,例如,你可能想要测试插入或查询的性能,而不实际保存任何数据。另一个常见用例是作为一个"黑洞"表,用来快速丢弃不需要的数据。

示例:

CREATE TABLE example_null
(date Date,id UInt32,value String
) ENGINE = Null;

总结:Null家族引擎基本上不执行任何操作,也不保存任何数据。尽管Null引擎在生产环境中的应用可能有限,但在调试和测试中可能很有用。

7. 外部数据表引擎(MySQL, HDFS, URL, etc.)

ClickHouse支持外部数据表引擎,这些引擎可以让你以类似于操作本地表的方式访问外部数据源。以下是一些常见的外部数据表引擎及其特点:

7.1. MySQL:

说明:MySQL表引擎允许你将MySQL数据库中的数据表作为ClickHouse本地表进行操作。这使得你可以方便地在ClickHouse中查询MySQL表数据。

使用场景:当你需要在ClickHouse中查询MySQL中的数据时,MySQL表引擎非常有用。

示例:

CREATE TABLE mysql_table
(id UInt32,name String,age UInt8
) ENGINE = MySQL('host:port', 'database_name', 'table_name', 'user', 'password');

7.2. HDFS:

说明:HDFS表引擎可以让你将Hadoop分布式文件系统(HDFS)中的数据表作为ClickHouse本地表进行操作。它支持各种文件格式,如Parquet、ORC、Avro等。

使用场景:当你需要在ClickHouse中查询HDFS中的数据时,HDFS表引擎非常有用。

示例:

CREATE TABLE hdfs_table
(id UInt32,name String,age UInt8
) ENGINE = HDFS('hdfs://host:port/path/to/data/file.parquet', 'Parquet');

7.3. URL:

说明:URL表引擎可以让你将远程文件(通过HTTP或HTTPS访问)作为ClickHouse本地表进行操作。它支持各种文件格式,如CSV、TSV、JSON等。

使用场景:当你需要在ClickHouse中查询远程文件中的数据时,URL表引擎非常有用。

示例:

CREATE TABLE url_table
(id UInt32,name String,age UInt8
) ENGINE = URL('https://example.com/data.csv', 'CSV', 'id UInt32, name String, age UInt8');

总结:外部数据表引擎可以让你方便地访问外部数据源,如MySQL、HDFS或URL等。这使得在ClickHouse中整合和查询多种数据源变得简单。


引擎类型

MergeTree {#mergetree}

适用于高负载任务的最通用和功能最强大的表引擎。这些引擎的共同特点是可以快速插入数据并进行后续的后台数据处理。 MergeTree系列引擎支持数据复制(使用Replicated* 的引擎版本),分区和一些其他引擎不支持的其他功能。

该类型的引擎:

  • MergeTree
  • ReplacingMergeTree
  • SummingMergeTree
  • AggregatingMergeTree
  • CollapsingMergeTree
  • VersionedCollapsingMergeTree
  • GraphiteMergeTree

日志

具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。

该类型的引擎:

  • TinyLog
  • StripeLog
  • Log

集成引擎 {#integration-engines}

用于与其他的数据存储与处理系统集成的引擎。
该类型的引擎:

  • Kafka
  • MySQL
  • ODBC
  • JDBC
  • HDFS

用于其他特定功能的引擎 {#yong-yu-qi-ta-te-ding-gong-neng-de-yin-qing}

该类型的引擎:

  • Distributed
  • MaterializedView
  • Dictionary
  • Merge
  • File
  • Null
  • Set
  • Join
  • URL
  • View
  • Memory
  • Buffer

虚拟列

虚拟列是表引擎组成的一部分,它在对应的表引擎的源代码中定义。

您不能在 CREATE TABLE 中指定虚拟列,并且虚拟列不会包含在 SHOW CREATE TABLEDESCRIBE TABLE 的查询结果中。虚拟列是只读的,所以您不能向虚拟列中写入数据。

如果想要查询虚拟列中的数据,您必须在SELECT查询中包含虚拟列的名字。SELECT * 不会返回虚拟列的内容。

若您创建的表中有一列与虚拟列的名字相同,那么虚拟列将不能再被访问。我们不建议您这样做。为了避免这种列名的冲突,虚拟列的名字一般都以下划线开头。

参考文档

  1. Yandex ClickHouse官方文档: https://clickhouse.tech/
  2. ClickHouse表引擎介绍: https://clickhouse.tech/docs/en/engines/table-engines/
  3. ClickHouse的表引擎选择: https://www.jianshu.com/p/752c1f8b38e7
  4. ClickHouse的数据存储和计算原理: https://www.jianshu.com/p/a1d3d6e1f76a
  5. ClickHouse表引擎深入理解: https://zhuanlan.zhihu.com/p/142616461

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/134532.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI】机器学习——感知机

文章目录 4.1 感知机基本概念4.2 策略4.2.1 数据集的线性可分性4.2.2 学习策略目标损失函数的构造关于距离的解释 4.3 算法4.3.1 原始形式损失函数的梯度下降法 4.3.2 PLA例题4.3.3 算法收敛性 4.4 PLA对偶形式4.4.1 原始PLA分析4.4.2 PLA对偶形式4.4.3 优点 4.1 感知机基本概念…

office mac苹果办公软件安装包安装教程详解

软件下载 软件:mac office版本:2021语言:简体中文大小:4.27G安装环境:mac硬件要求:CPU2.0GHz 内存4G(或更高)下载通道 百度网盘 https://pan.baidu.com/s/1WGSB-icELUxweFkI8iIbzA 首先&#…

什么是JavaScript的事件驱动编程(event-driven programming)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 事件(Event)⭐ 事件监听器(Event Listener)⭐ 回调函数(Callback Function)⭐ 非阻塞和异步⭐ 事件循环(Event Loop)⭐ 触发事件(…

知识竞赛活动舞台搭建需要多少钱

知识竞赛活动舞台搭建的费用会根据不同的竞赛活动规模和要求而有所不同。对于小型的知识竞赛活动,如学校内部组织的知识竞赛或社区的知识竞赛活动,舞台搭建的费用往往相对较低。在这种情况下,可能只需要一些简单的装饰和道具,例如…

【C++进阶】:哈希(一)

哈希 一.unordered_map二.底层结构1.哈希概念2.解决哈希冲突1.闭散列2.开散列 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 l o g 2 N log_2N log2​N,即最差情况下需要比较红黑树的高度次,当树中的…

Linux:基础开发工具之yum,vim,gcc的使用

文章目录 yumvimgcc 本篇主要总结的是Linux下开发工具 yumvimgcc/g yum 什么是yum? 不管是在手机移动端还是pc端,不管是什么操作系统,当用户想要下载一些内容或者工具的时候,都需要到一个特定的位置进行下载,例如在…

初识Java 9-2 内部类

目录 为什么需要内部类 闭包和回调 内部类和控制框架 继承内部类 内部类的重写(并不能) 局部内部类 内部类标识符 本笔记参考自: 《On Java 中文版》 为什么需要内部类 在一些情况下,我们无法享受接口带来的便利&#xff0…

c刷题(四)

目录 获得月份天数 判断字母 字母大小写转换 网购 下列程序段的输出结果 字符逆序 自幂数 a的前n项之和 最小公倍数 倒置字符串 获得月份天数 获得月份天数_牛客题霸_牛客网 这道题可以用switch case语句解,不过这道题更简单的方法是数组,关…

AE-如何制作湖面水波纹波动的效果

目录 1.新建水面合成 2.新建纯色层命名为“分形杂色”,并添加“分形杂色”效果,设置相关参数 3.添加3D效果,并添加摄像机和空对象 4.新建中秋节合成,导入背景图,新建调整图层,并在调整图层上增加“焦散…

【C++】动态内存管理(79分钟写的文章哪里看不懂了,快来学)

动态内存管理目录: 一、C/C内存分布 在学习了C/C内存区域的划分后,我们来做几道题巩固一下: 1. 选择题:选项 : A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)globalVar在哪里?____ staticGlobalVar在哪里&#x…

一个Binder的前生今世 (一):Service的创建

一个Binder的前生今世 (一):Service的创建 一个Binder的前生今世Binder的历史 (字面意义的前生今世)Binder的生命周期(抽象意义的前生今世)Binder 应用及系统层关系图Binder应用层的架构设计Binder应用层实现Binder的创建服务端Binder的创建服务端Binder的传递Binder在客…

实现按钮悬停动画

知识点与技巧 伪元素 使用伪元素来作为按钮悬停效果动画展示的元素 z-index 的使用技巧 使用z-index属性来控制按钮和伪元素的层次关系 transform、transition 复习 使用transform、transition两个属性来实现动画的展示 按钮边框动画 切换效果 核心代码 .btn.btn-border-…

2023面试知识点一

1、新生代和老年代的比例 默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) 1/3 的堆空间大小。老年代 ( Old ) 2/3 的堆空间大小。其中,新生代 ( …

Unity减少发布打包文件的体积——获取精灵图片的信息限制它的大小

一、起因 一个工程,打包成webGL且压缩成zip文件后,接近400M,后来把大的精灵图片设置最大尺寸,降低大小后,再次发布,zip文件缩减到250M 二、如何一键获得工程里面的精灵图片信息 三、获取精灵图片信息 1、…

esp32-S3-electric-vehicle-expansion(EVE_V2)硬件分享

一. 简介 本次将给大家分享一个QSPI圆形屏幕DIY的小项目,这是我做的第二个版本的,相较于第一个版本有了比较大的改动(第一版就不放出来了,需要的可以私聊),可以在上面实现更多的功能,做些更有趣的项目 ,也…

[libc-2.31 off_by_null] N0wayBack ezheap练习

以前保留了个WP,但是没复现过也没法用,用了两个晚上慢慢理复现一下。 先看这个题 while ( 1 ){menu();__isoc99_scanf("%d", &v3);switch ( v3 ){case 1:m1add(); //带readbreak;case 2:m2free();break;case 3:m3edit(); //溢出br…

视频监控系统/安防监控/视频AI智能分析:小动物识别算法场景汇总

随着人们对生态环境的关注日益提升,大家对动物保护意识也逐渐增强。旭帆科技智能分析网关小动物识别算法应运而生。除了对保护动物的识别以外,旭帆科技AI智能分析网关还可以识别常见的老鼠等动物,助力明厨亮灶监管,保卫食品安全。…

uniapp风险等级(三级)

代码 ​ <template><view><view class"riskGrade"><label>风险等级: </label><span v-if"flag 0 || flag 1 || 2" class"item":style"[{background:flag0?color:flag1?color:flag2?color:}]"…

Redis 事务 - 监控测试

Redis 基本事务操作 Redis事务本质&#xff1a;一组命令的集合&#xff01;一个事务中的所有命令都会被序列化&#xff0c;在事务执行过程的中&#xff0c;会按照顺序执行&#xff01; Redis事务是一组Redis命令的有序集合&#xff0c;这些命令在事务中按照顺序执行&#xff0…

voliate实战:voliate可见性验证有序性非原子性验证

一、可见性验证 下面的程序验证了voliate的可见性。 public class VolatileVisibilityTest {private static volatile boolean inintFlag false;public static void main(String[] args) throws InterruptedException {new Thread(() -> {System.out.println("waiti…