ClickHouse(07)ClickHouse数据库引擎解析

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: ClickHouse支持多种数据库引擎,包括Atomic(默认)、MySQL、MaterializeMySQL、Lazy、PostgreSQL、MaterializedPostgreSQL。Atomic提供非阻塞的表操作和原子的表交换,有UUID标识和延迟删除功能。MySQL引擎允许与远程MySQL服务器交互,支持INSERT和SELECT,不支持RENAME操作。PostgreSQL引擎类似,可与远程PostgreSQL服务进行读写操作。SQLite引擎用于连接SQLite数据库。实验性引擎如MaterializeMySQL和MaterializedPostgreSQL用于实现实时数据同步。

这里会介绍ClickHouse几种数据库引擎,已经对应的特点和应用的场景。数据库引擎允许您处理数据表。默认情况下,ClickHouse使用Atomic数据库引擎。它提供了可配置的table engines和SQL dialect。

目前的数据库引擎:

  • MySQL
  • MaterializeMySQL
  • Lazy
  • Atomic
  • PostgreSQL
  • MaterializedPostgreSQL
  • Replicated
  • SQLite

Atomic

支持非阻塞的DROP TABLE和RENAME TABLE查询和原子的EXCHANGE TABLES t1 AND t2查询。默认情况下使用Atomic数据库引擎。

建表语句

  CREATE DATABASE test[ ENGINE = Atomic];

特性

Table UUID

数据库Atomic中的所有表都有唯一的UUID,并将数据存储在目录/clickhouse_path/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/,其中xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy是该表的UUID。

通常,UUID是自动生成的,但用户也可以在创建表时以相同的方式显式指定UUID(不建议这样做)。例如:

CREATE TABLE name UUID '28f1c61c-2970-457a-bffe-454156ddcfef' (n UInt64) ENGINE = ...;

RENAME TABLES

RENAME查询是在不更改UUID和移动表数据的情况下执行的。这些查询不会等待使用表的查询完成,而是会立即执行。

DROP/DETACH TABLES

在DROP TABLE上,不删除任何数据,数据库Atomic只是通过将元数据移动到/clickhouse_path/metadata_dropped/将表标记为已删除,并通知后台线程。最终表数据删除前的延迟由database_atomic_delay_before_drop_table_sec设置指定。

可以使用SYNC修饰符指定同步模式。使用database_atomic_wait_for_drop_and_detach_synchronously设置执行此操作。

EXCHANGE TABLES

EXCHANGE以原子方式交换表。

-- 非原子操作
RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table;

--原子操作
EXCHANGE TABLES new_table AND old_table;

ReplicatedMergeTree in Atomic Database

对于ReplicatedMergeTree表,建议不要在ZooKeeper和副本名称中指定engine-path的参数。在这种情况下,将使用配置的参数default_replica_path和default_replica_name。

如果要显式指定引擎的参数,建议使用{uuid}宏。这是非常有用的,以便为ZooKeeper中的每个表自动生成唯一的路径。

MySQL

MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换。

MySQL数据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中,因此您可以执行诸如SHOW TABLES或SHOW CREATE TABLE之类的操作。

但无法对其执行操作:RENAME、CREATE TABLE和ALTER。

创建数据库

CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')

引擎参数

  • host:port — MySQL服务地址
  • database — MySQL数据库名称
  • user — MySQL用户名
  • password — MySQL用户密码

mysql与ClickHouse数据类型对应

MySQL ClickHouse
UNSIGNED TINYINT UInt8
TINYINT Int8
UNSIGNED SMALLINT UInt16
SMALLINT Int16
UNSIGNED INT UInt32
UNSIGNED MEDIUMINT UInt32
INT,MEDIUMINT Int32
UNSIGNED BIGINT UInt64
BIGINT Int64
FLOAT Float32
DOUBLE Float64
DATE Date
DATETIME,TIMESTAMP DateTime
BINARY FixedString

其他的MySQL数据类型将全部都转换为String。

使用例子

MySQL操作:

mysql> USE test;
Database changed

mysql> CREATE TABLE `mysql_table` (
    ->   `int_id` INT NOT NULL AUTO_INCREMENT,
    ->   `float` FLOAT NOT NULL,
    ->   PRIMARY KEY (`int_id`));
Query OK, 0 rows affected (0,09 sec)

mysql> insert into mysql_table (`int_id`, `float`) VALUES (1,2);
Query OK, 1 row affected (0,00 sec)

mysql> select * from mysql_table;
+------+-----+
| int_id | value |
+------+-----+
|      1 |     2 |
+------+-----+
1 row in set (0,00 sec)

ClickHouse中的数据库,与MySQL服务器交换数据:

CREATE DATABASE mysql_db ENGINE = MySQL('localhost:3306', 'test', 'my_user', 'user_password')

SHOW DATABASES

┌─name─────┐
│ default  │
│ mysql_db │
│ system   │
└──────────┘

SHOW TABLES FROM mysql_db

┌─name─────────┐
│  mysql_table │
└──────────────┘

SELECT * FROM mysql_db.mysql_table

┌─int_id─┬─value─┐
│      12 │
└────────┴───────┘

INSERT INTO mysql_db.mysql_table VALUES (3,4)

SELECT * FROM mysql_db.mysql_table

┌─int_id─┬─value─┐
│      12 │
│      34 │
└────────┴───────┘

PostgreSQL

允许连接到远程PostgreSQL服务。支持读写操作(SELECT和INSERT查询),以在ClickHouse和PostgreSQL之间交换数据。

在SHOW TABLES和DESCRIBE TABLE查询的帮助下,从远程PostgreSQL实时访问表列表和表结构。

支持表结构修改(ALTER TABLE ... ADD|DROP COLUMN)。如果use_table_cache参数(参见下面的引擎参数)设置为1,则会缓存表结构,不会检查是否被修改,但可以用DETACH和ATTACH查询进行更新。

使用总体上与mysql引擎类似

创建数据库

CREATE DATABASE test_database 
ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `use_table_cache`]);

引擎参数

  • host:port — PostgreSQL服务地址
  • database — 远程数据库名次
  • user — PostgreSQL用户名称
  • password — PostgreSQL用户密码
  • schema - PostgreSQL 模式
  • use_table_cache — 定义数据库表结构是否已缓存或不进行。可选的。默认值: 0

数据类型对应

PostgreSQL ClickHouse
DATE Date
TIMESTAMP DateTime
REAL Float32
DOUBLE Float64
DECIMAL Decimal
NUMERIC Decimal
SMALLINT Int16
INTEGER Int32
BIGINT Int64
SERIAL UInt32
BIGSERIAL UInt64
TEXT String
CHAR String
INTEGER Nullable(Int32)
ARRAY Array

SQLite

允许连接到SQLite数据库,并支持ClickHouse和SQLite交换数据, 执行INSERT和SELECT查询。

SQLite将整个数据库(定义、表、索引和数据本身)存储为主机上的单个跨平台文件。在写入过程中,SQLite会锁定整个数据库文件,因此写入操作是顺序执行的。读操作可以是多任务的。SQLite不需要服务管理(如启动脚本)或基于GRANT和密码的访问控制。访问控制是通过授予数据库文件本身的文件系统权限来处理的。

创建数据库

    CREATE DATABASE sqlite_database 
    ENGINE = SQLite('db_path')

引擎参数

  • db_path — SQLite 数据库文件的路径

数据类型对应

SQLite ClickHouse
INTEGER Int32
REAL Float32
TEXT String
BLOB String

Lazy

在最后一次访问之后,只在RAM中保存expiration_time_in_seconds秒。只能用于Log表。

它是为存储许多小的Log表而优化的,对于这些表,访问之间有很长的时间间隔。

创建数据库

    CREATE DATABASE testlazy ENGINE = Lazy(expiration_time_in_seconds);

Replicated

该引擎基于Atomic引擎。它支持通过将DDL日志写入ZooKeeper并在给定数据库的所有副本上执行的元数据复制。

一个ClickHouse服务器可以同时运行和更新多个复制的数据库。但是同一个复制的数据库不能有多个副本。

这是一个实验性的引擎,不应该在生产中使用。

创建数据库

    CREATE DATABASE testdb ENGINE = Replicated('zoo_path', 'shard_name', 'replica_name') [SETTINGS ...]

MaterializeMySQL

创建ClickHouse数据库,包含MySQL中所有的表,以及这些表中的所有数据。

ClickHouse服务器作为MySQL副本工作。它读取binlog并执行DDL和DML查询。

这是一个实验性的引擎,不应该在生产中使用。

创建数据库

CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...]

MaterializedPostgreSQL

使用PostgreSQL数据库表的初始数据转储创建ClickHouse数据库,并启动复制过程,即执行后台作业,以便在远程PostgreSQL数据库中的PostgreSQL数据库表上发生新更改时应用这些更改。

ClickHouse服务器作为PostgreSQL副本工作。它读取WAL并执行DML查询。DDL不是复制的,但可以处理(如下所述)。

这是一个实验性的引擎,不应该在生产中使用。

创建数据库

CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MaterializedPostgreSQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...]

资料分享

ClickHouse经典中文文档分享

系列文章

clickhouse系列文章

相关文章
|
4天前
|
SQL NoSQL 关系型数据库
数据库技术深度解析与未来趋势展望
一、引言 数据库技术是信息时代的基石,它支撑着无数应用的正常运行,并为企业和组织提供了强大的数据管理能力
|
4天前
|
存储 SQL NoSQL
数据库技术深度解析:从基础到前沿应用
一、引言 在当今信息化社会,数据已成为企业运营和决策的核心
|
4天前
|
存储 SQL 数据管理
数据库技术深度解析:原理、应用与未来展望
一、引言 数据库技术作为现代信息技术的基石,承载着数据存储、管理、检索和分析的重任
|
5天前
|
SQL 存储 多模数据库
数据库技术:从基础到前沿应用的全面解析
一、引言 随着信息技术的迅猛发展,数据已经成为企业和组织最重要的资产之一
|
8天前
|
存储 SQL NoSQL
ClickHouse(16)ClickHouse日志表引擎Log详细解析
ClickHouse的Log引擎系列适用于小数据量(<1M行)的表,包括StripeLog、Log和TinyLog。这些引擎将数据存储在磁盘,追加写入,不支持更新和索引,写入非原子可能导致数据损坏。Log和StripeLog支持并发访问和并行读取,Log按列存储,StripeLog将所有数据存于一个文件。TinyLog是最简单的,不支持并行读取和并发访问,每列存储在单独文件中。适用于一次性写入、多次读取的场景。
15 0
|
8天前
|
存储 Cloud Native NoSQL
深度解析数据库技术:核心原理、应用实践及未来展望
一、引言 在信息化高速发展的今天,数据库技术作为数据管理的基石,承载着企业运营、决策支持、大数据分析等核心功能
|
9天前
|
传感器 存储 SQL
ClickHouse(15)ClickHouse合并树MergeTree家族表引擎之GraphiteMergeTree详细解析
GraphiteMergeTree是ClickHouse用于优化Graphite数据存储和汇总的表引擎,适合需要瘦身和高效查询Graphite数据的开发者。它基于MergeTree,减少存储空间并提升查询效率。创建表时需包括Path、Time、Value和Version列。配置涉及pattern、regexp、function和retention,用于指定聚合函数和数据保留规则。文章还提供了建表语句示例和相关资源链接。
11 1
|
9天前
|
DataWorks API 调度
DataWorks产品使用合集之在调度配置配置了节点的上游节点输出,没办法自动生成这个flow的依赖,该怎么操作
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
9天前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之建了 polar 与clickhouse的数据源。为什么数据库这里总是mysql呢
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
12天前
|
存储 SQL 算法
ClickHouse(14)ClickHouse合并树MergeTree家族表引擎之VersionedCollapsingMergeTree详细解析
VersionedCollapsingMergeTree是ClickHouse的一种优化引擎,扩展了MergeTree,支持多线程异步插入和高效的数据折叠。它通过Sign和Version列处理对象状态的变化,Sign表示行的状态(正向或撤销),Version追踪状态版本。引擎自动删除旧状态,减少存储占用。在查询时,需注意可能需使用GROUP BY和聚合函数确保数据折叠,因为ClickHouse不保证查询结果已折叠。文章还提供了建表语法、使用示例和相关资源链接。
16 0