clickhouse引擎介绍

MergeTree家族 (LSM-Tree 数据结构)

Replicated(副本)+ MergeTree等 = ReplicatedMergeTree

  1. MergeTree :

  2. ReplacingMergeTree : 在后台数据合并期间,对具有相同排序键的数据进行去重操作。

  3. SummingMergeTree : 当合并数据时,会把具有相同主键的记录合并为一条记录。根据聚合字段设置,该字段的值为聚合后的汇总值,非聚合字段使用第一条记录的值,聚合字段类型必须为数值类型。

  4. AggregatingMergeTree : 在同一数据分区下,可以将具有相同主键的数据进行聚合。

  5. CollapsingMergeTree : 在同一数据分区下,对具有相同主键的数据进行折叠合并。

  6. VersionedCollapsingMergeTree : 基于CollapsingMergeTree引擎,增添了数据版本信息字段配置选项。在数据依据ORDER BY设置对数据进行排序的基础上,如果数据的版本信息列不在排序字段中,那么版本信息会被隐式的作为ORDER BY的最后一列从而影响数据排序。

  7. GraphiteMergeTree : 用来存储时序数据库Graphites的数据。

Log Engines

Log系列表引擎功能相对简单,主要用于快速写入小表(1百万行左右的表),然后全部读出的场景。

几种Log表引擎的共性是:

  • 数据被顺序append写到磁盘上;
  • 不支持delete、update;
  • 不支持index;
  • 不支持原子性写;
  • insert会阻塞select操作。
  1. TinyLog : 不支持并发读取数据文件,查询性能较差;格式简单,适合用来暂存中间数据;

  2. Log : 支持并发读取数据文件,查询性能比TinyLog好;每个列会单独存储在一个独立文件中。

Integration Engines

该系统表引擎主要用于将外部数据导入到ClickHouse中,或者在ClickHouse中直接操作外部数据源。

  1. Kafka:将Kafka Topic中的数据直接导入到ClickHouse;
  2. MySQL:将Mysql作为存储引擎,直接在ClickHouse中对MySQL表进行select等操作;
  3. JDBC/ODBC:通过指定jdbc、odbc连接串读取数据源;
  4. HDFS:直接读取HDFS上的特定格式的数据文件;

Special Engines

  1. Memory:将数据存储在内存中,重启后会导致数据丢失。查询性能极好,适合于对于数据持久性没有要求的1亿一下的小表。在ClickHouse中,通常用来做临时表。

  2. Buffer:为目标表设置一个内存buffer,当buffer达到了一定条件之后会flush到磁盘。

  3. File:直接将本地文件作为数据存储;

  4. Null:写入数据被丢弃、读取数据为空;

  5. Distributed : Distributed 引擎并不存储真实数据,而是来做分布式写入和查询,与其他引擎配合使用。比如:Distributed + 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], 
      ... 
) ENGINE = MergeTree()
  ORDER BY expr 
  [PARTITION BY expr] 
  [PRIMARY KEY expr] 
  [SAMPLE BY expr] 
  [TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...] 
  [SETTINGS name=value, ... 

-- ex
   CREATE TABLE test (
  id UInt16,
  create_time Date,
  title Nullable(String)
) ENGINE = MergeTree()
   PARTITION BY create_time
     ORDER BY  (id, create_time)
     PRIMARY KEY (id, create_time)
     TTL create_time + INTERVAL 1 MONTH
     SETTINGS index_granularity=8192;
   
-- 必填选项
# ENGINE:
   引擎名字,MergeTree引擎无参数。
# ORDER BY:
   排序键,可以由一列或多列组成,决定了数据以何种方式进行排序,例如ORDER BY(CounterID, EventDate)。如果没有显示指定PRIMARY KEY,那么将使用ORDER BY作为PRIMARY KEY。通常只指定ORDER BY即可。

-- 选填选项
# PARTITION BY:
   分区键,指明表中的数据以何种规则进行分区。分区是在一个表中通过指定的规则划分而成的逻辑数据集。分区可以按任意标准进行,如按月、按日或按事件类型。为了减少需要操作的数据,每个分区都是分开存储的。
# PRIMARY KEY:
   主键,设置后会按照主键生成一级索引(primary.idx),数据会依据索引的设置进行排序,从而加速查询性能。默认情况下,PRIMARY KEY与ORDER BY设置相同,所以通常情况下直接使用ORDER BY设置来替代主键设置。
# SAMPLE BY:
   数据采样设置,如果显示配置了该选项,那么主键配置中也应该包括此配置。例如 ORDER BY CounterID / EventDate / intHash32(UserID)、SAMPLE BY intHash32(UserID)。
# TTL:
   数据存活时间,可以为某一字段列或者一整张表设置TTL,设置中必须包含Date或DateTime字段类型。如果设置在列上,那么会删除字段中过期的数据。如果设置的是表级的TTL,那么会删除表中过期的数据。如果设置了两种类型,那么按先到期的为准。例如,TTL createtime + INTERVAL 1 DAY,即一天后过期。使用场景包括定期删除数据,或者定期将数据进行归档。
# index_granularity:
   索引间隔粒度。MergeTree索引为稀疏索引,每index_granularity条数据产生一条索引。index_granularity默认设置为8092。
# enable_mixed_granularity_parts:
   是否启动index_granularity_bytes来控制索引粒度大小。
# index_granularity_bytes:
   索引粒度,以字节为单位,默认10Mb。
# merge_max_block_size:
   数据块合并最大记录个数,默认8192。
# merge_with_ttl_timeout:
   合并频率最小时间间隔,默认1天。

上一篇:未能加载文件或程序集“log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821”或它的某一个依赖项。系统找不到指定的文件。


下一篇:STM32零基础入门教程