ClickHouse的引擎

本文详细介绍了ClickHouse的表引擎,重点讲解了MergeTree系列引擎,包括TinyLog、MySQL、ReplacingMergeTree、SummingMergeTree、AggregatingMergeTree、CollapsingMergeTree和VersionedCollapsingMergeTree的特性和使用场景,特别是MergeTree引擎在海量数据分析中的应用。
摘要由CSDN通过智能技术生成

ClickHouse提供了多种不同的表引擎,表引擎可以简单理解为不同类型的表。

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

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

下面介绍其中常用的几种,对其他引擎有兴趣的可以去查阅官方文档:https://clickhouse.tech/docs/zh/engines/table-engines/

1 日志引擎

1.1 TinyLog引擎

最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。

该引擎没有并发控制

  • 如果同时从表中读取和写入数据,则读取操作将抛出异常;
  • 如果同时写入多个查询中的表,则数据将被破坏。

这种表引擎的典型用法是 write-once:首先只写入一次数据,然后根据需要多次读取。此引擎适用于相对较小的表(建议最多1,000,000行)。如果有许多小表,则使用此表引擎是适合的,因为它比需要打开的文件更少。当拥有大量小表时,可能会导致性能低下。不支持索引。

案例:创建一个TinyLog引擎的表并插入一条数据

create table user (id UInt16, name String) ENGINE=TinyLog;
insert into user (id, name) values (1, 'zhangsan');

此时我们到保存数据的目录/var/lib/clickhouse/data/default/user中可以看到如下目录结构:

id.bin
name.bin
sizes.json

id.bin 和 name.bin 是压缩过的对应的列的数据,sizes.json 中记录了每个 *.bin 文件的大小。

2 数据库引擎

ClickHouse提供了本机MySQLLazy这3种数据库引擎,但在默认情况下仅使用其本机数据库引擎,该引擎提供可配置的表引擎(MergeTree、Log和Intergation)和SQL方言(完整的SQL解析器,即递归下降解析器;数据格式解析器,即快速流解析器)。还可以使用MySQL和Lazy。

2.1 MySQL引擎

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

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

但您无法对其执行以下操作:

  • RENAME
  • CREATE TABLE
  • ALTER

语法结构:

-- 创建Mysql引擎的语法
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')

MySQL数据库引擎参数:

  • host:port— 链接的MySQL地址。
  • database— 链接的MySQL数据库。
  • user— 链接的MySQL用户。
  • password— 链接的MySQL用户密码。

使用示例:

  • 在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类型的数据库,同时与MySQL服务器交换数据:

    CREATE DATABASE mysql_db ENGINE = MySQL('www.yourhose.com:3306', 'test', 'root', '123456')
    
    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 │
    └──────┴─────┘
    

3 MergeTree系列引擎(重点)

MergeTree(合并树)系列引擎是ClickHouse中最强大的表引擎,是官方主推的存储引擎,几乎支持ClickHouse所有的核心功能。

该系列引擎主要用于海量数据分析的场景,支持对表数据进行分区、复制、采样、存储有序、主键索引、稀疏索引和数据TTL等特性。

MergeTree系列引擎的基本理念是当有大量数据要插入到表中时,需要高效地一批一批的写入数据片段,并希望这些数据片段在后台按照一定规则合并,这种方法比插入期间连续重写存储中的数据效率更高

简而言之就是具有批量数据快速插入和后台并发处理的优势。

MergeTree系列引擎支持ClickHouse所有的SQL语法,但还是有一些SQL语法和MySQL并不太一样。

MergeTree系列引擎包括:

  • ReplacingMergeTree
  • SummingMergeTree
  • AggregatingMergeTree
  • CollapsingMergeTree
  • VersionedCollapsingMergeTree

3.1 MergeTree

MergeTree引擎的表的允许插入主键重复的数据,主键主要作用是生成主键索引来提升查询效率,而不是用来保持记录主键唯一

  • 创建MergeTree表的说明

    -- 创建MergeTree引擎表的语法
    CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
    (
        name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
        name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
        ...
        INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
        INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
    ) ENGINE = MergeTree()
    [PARTITION BY expr]
    [ORDER BY expr]
    [PRIMARY KEY expr]
    [SAMPLE BY expr]
    [TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
    [SETTINGS name=value, ...]
    
    子句说明 使用方式
    ENGINE ENGINE = MergeTree() --说明:该引擎不需要参数。
    PARTITION BY 字段名称 PARTITION by to YYYYMM(cdt)
    ORDER BY 字段名称(可以是元组) ORDER BY cdt或ORDER BY (age,gender)
    PRIMARY KEY 字段名称 PRIMARY KEY age
    SAMPLE BY 字段名称 SAMPLE BY intHash64(userId)
    TTL Date字段或DateTime字段 TTL cdt + INTERVAL 1 DAY
    SETTINGS index_granularity=8192 说明:索引粒度。即索引中相邻”标记”间的数据行数。设为 8192 可以适用大部分场景。
    SETTINGS index_granularity_bytes= 说明:设置数据粒度的最大大小(单位/字节),默认10MB。从大行(数十和数百MB)的表中select数据时,此设置可提高ClickHouse的提高select性能。
    SETTINGS enable_mixed_granularity_parts 说明:启用或禁用过渡。
    SETTINGS use_minimalistic_part_header_in_zookeeper 说明:在ZK中存储数据部分标题,0是关闭,1是存储的少量数据。
    SETTINGS min_merge_bytes_to_use_direct_io 说明:使用对存储磁盘的直接I / O访问所需的最小合并操作数据量。合并数据部分时,ClickHouse会计算要合并的所有数据的总存储量。如果卷超过min_merge_bytes_to_use_direct_io字节,ClickHouse将使用直接I/O接口(O_DIRECT选项)读取数据并将数据写入存储磁盘。如果为min_merge_bytes_to_use_direct_io = 0,则直接I / O被禁用。
    默认值:10 * 1024 * 1024 * 1024字节。
    SETTINGS merge_with_ttl_timeout 说明:与TTL合并之前的最小延迟(单位/秒),默认86400。
    SETTINGS write_final_mark 说明:启用或禁用在数据部分末尾写入最终索引标记,默认1。建议不关闭此设置。
    SETTINGS storage_policy 说明:存储策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值