clickhouse相关的引擎

  1. tinylog
  2. mysql 引擎
  3. replaceingMerge Tree
  4. SummingMergeTree 引擎
  5. AggregatingMergeTree 引擎
  6. CK 引擎之CollapsingMergeTree 引擎
  7. CK 引擎之多版本折叠树引擎

«««< HEAD clickhouse 的引擎是这个数据库的一大特色

引擎决定了如何存储表的数据

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

表引擎的使用方式是否必须显式在创建表时候定义表使用引擎,以及引擎相关使用参数

1.1 tinyLog

以列文件形式保存磁盘,不支持索引,没有并发控制,一般保存少量数据

参考文档

这个log引擎会直接锁表

1.2 memory

内存引擎,数据以未压缩的原始形式保存在内存,服务器重启数据消失,读写操作不会相互阻塞,不支持索引。简单查询下有非常非常高的性能 (超过 10G/s)

一般用在测试,一般用不到它,除了测试,就是需要用在需要非常高的性能,同时数据量又不大的情况下(上限一亿行)的场景

1.3 mergeTree

最重要的是这个,一个系列,合并树家族

replaceingMerge Tree,SummingMergeTree 都是他的衍生引擎

参考教程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
create table t_order_mt (
	id UInt32,
    sku_id String,
    total_amounte Decimal(16,2),
    create_time Datetime

) engine = MergeTree
partition by toYYYYMMDD(create_time)
primary key(id)
order by(id,sku_id);

数据Partitioning

ClickHouse支持PARTITION BY子句,在建表时可以指定按照任意合法表达式进行 数据分区 操作,比如通过toYYYYMM()将数据按月进行分区、toMonday()将数据按照周几进行分区、对Enum类型的列直接每种取值作为一个分区等。

数据Partition在ClickHouse中主要有两方面应用:

  • partition key 上进行分区裁剪,只查询必要的数据。灵活的partition expression设置,使得可以根据SQL Pattern进行分区设置,最大化的贴合业务特点。
  • 对partition进行TTL管理,淘汰过期的 分区数据

分区原理参考

partition原理 首先,partition并不是一个新鲜的概念,在很多数据库和分布式应用的设计中都会用到数据分区的思想。本质上partition就是对数据按照某种指定的规则进行切分,相同分区的数据在物理上往往会写入同一个文件或目录下,其目的是为了缩小查询范围,加快查询的速度。当然都叫partition,但是大家其实在实现的时候还是有一些差异的。

对某个字段做汇聚,如果按非partition的字段做范围查询,查询耗时1164秒,但如果按分区字段查询,查询时间则缩短到了4秒钟,简直天壤之别~~:

分区是表的分区,具体的DDL操作关键词是 PARTITION BY,指的是一个表按照某一列数据(比如日期)进行分区,对应到最终的结果就是不同分区的数据会写入不同的文件中。

分片复用了数据库的分区,相当于在原有的分区下,作为第二层分区, 是在不同节点/机器上的体现。

https://upload-images.jianshu.io/upload_images/21274876-eaf1f19566246fa1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1200/format/webp

数据分区-允许查询在指定了分区键的条件下,尽可能的少读取数据 数据分片-允许多台机器/节点同并行执行查询,实现了分布式并行计算

数据Partitioning

ClickHouse支持PARTITION BY子句,在建表时可以指定按照任意合法表达式进行数据分区操作,比如通过toYYYYMM()将数据按月进行分区、toMonday()将数据按照周几进行分区、对Enum类型的列直接每种取值作为一个分区等。

数据Partition在ClickHouse中主要有两方面应用:

在partition key上进行分区裁剪,只查询必要的数据。灵活的partition expression设置,使得可以根据SQL Pattern进行分区设置,最大化的贴合业务特点

对partition进行TTL管理,淘汰过期的分区数据。

作用

学过 hive的都知道,分区目的是降低扫描的范围,优化查询速度。

  • 如果不填: 只会使用一个分区
  • 分区目录: mergeTree 是以列文件+ 索引文件+表定义文件组成的,但是如果设定分区那么 这些问卷就会保存到不同的分区目录中。

其他特性

列 TTL

当列中的值过期时, ClickHouse会将它们替换成该列数据类型的默认值。如果数据片段中列的所有值均已过期,则ClickHouse 会从文件系统中的数据片段中删除此列。

TTL子句不能被用于主键字段。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
CREATE TABLE example_table
(
    d DateTime,
    a Int TTL d + INTERVAL 1 MONTH,
    b Int TTL d + INTERVAL 1 MONTH,
    c String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d;

MergeTree合并树家族引擎

ReplacingMergeTree

该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。

在数据合并的时候会对主键进行去重,合并会在后台执行,执行时间未知,因此你无法预先做出计划

ReplacingMergeTree会根据ORDER BY所声明的表达式去重

创建表时没有设置ver参数,故保留分组内的最后一条数据(create_time字段)

AggregateMergeTree

该引擎改变了数据片段的合并逻辑,ClickHouse会将相同主键的所有行(在一个数据片段内)替换为单个存储一系列的聚合函数状态的行。可以使用该引擎来做增量数据统计聚合,包括物化视图的数据聚合。 AggregateMergeTree引擎的表不能直接使用insert来查询写入数据。一般用 insert select 来写入数据,常用于该引擎做增量数据统计聚合,包括物化视图的数据聚合

1
create table arr_table_base (id String, city String, code String,value UInt32) engine=MergeTree partition by city order by (id,city);

创建物化视图

1
2
3
4
create materialized view agg_view engine=AggregatingMergeTree() partition by
city order by(id,city)
as select id,city,uniqState(code) as code,
sumState(value) as value from arr_table_base group by id,city;

CollapsingMergeTree

CollapsingMergeTree会异步的删除特定列Sign有1和-1的值以外,其余所有字段的值都相等的成对的行。没有成对的行会被保留。该引擎可以降低存储量提高select查询效率。CollapsingMergeTree引擎有个状态列sign,这个值为1是”状态“行,-1为”取消“行。 对于数据而言只关心状态列为状态的数据,不关心状态列为取消的数据。

其他笔记

[[post/02.数据库/01.MySQL/3.索引 | mysql索引]] [[post/11.个人总结/mysql/mysql 索引 | 索引总结]]