ClickHouse-MergeTree引擎

1、MergeTree引擎

order by 设定了分区内的数据按照哪些字段顺序进行有序保存

order by是MergeTree中唯一一个必填项目,甚至primary key还重要,因为用户不设置主键的情况,很多处理会依照order by 的字段进行处理

主键必须是order by字段的前缀字段必须包含主键字段

创建二级索引测试表:

CREATE TABLE t_order_mt2 (
	id UInt32,
	sku_id String,
	total_amount DECIMAL ( 16, 2 ),
	create_time Datetime,
	INDEX a total_amount TYPE minmax GRANULARITY 5 
) ENGINE = MergeTree PARTITION BY toYYYYMMDD ( create_time ) PRIMARY KEY ( id ) 
ORDER BY
	( id, sku_id );


#查询金额大于900的
select * from t_order_mt2 where total_amount > toDecimal32(900,2);

#跟踪路径查询
#1、先退出客户端
quit;
#2、跟踪查询
clickhouse-client --send_logs_level=trace <<< 'select * from t_order_mt2 where total_amount > toDecimal32(900,2)';

其中 GRANULARITY是设定二级索引对于一级索引粒度的粒度

 以上文件中多个2个文件:跳数索引

TTL:数据存活时间、MergeTree提供了可以管理数据表或者列的生命周期的功能

过期时间列:设置过期时间列不能是主键、涉及判断的字段类型类型必须是日期类型,到期自动清理

#创建测试表,对具体的某一列做过期时间设置
CREATE TABLE t_order_mt3 (
	id UInt32,
	sku_id String,
	total_amount DECIMAL ( 16, 2 ) TTL create_time + INTERVAL 10 SECOND,
	create_time Datetime 
) ENGINE = MergeTree PARTITION BY toYYYYMMDD ( create_time ) PRIMARY KEY ( id ) 
ORDER BY
	( id, sku_id );

表级别TTL:

#修改表的ttl属性
alter table t_order_mt3 MODIFY TTL create_time + INTERVAL 10 second;

#修改列的ttl属性
alter table t_order_mt3 MODIFY CLOUMN c String TTL create_time + INTERVAL 10 second;

2、ReplacingMergeTree引擎

ReplacingMergeTree是MergeTree的一个变种,它存储特性完全继承了MergeTree、只是多了一个去重的功能(MergeTree的主键并没有实现唯一约束的功能),保证最终一致性。

创建表的方式

	CREATE TABLE t_order_mt4 (
	id UInt32,
	sku_id String,
	total_amount DECIMAL ( 16, 2 ) TTL create_time + INTERVAL 10 SECOND,
	create_time Datetime 
) ENGINE = ReplacingMergeTree(create_time) PARTITION BY toYYYYMMDD ( create_time ) 
PRIMARY KEY ( id ) 
ORDER BY
	( id, sku_id );
  • 数据的去重只会在数据合并的时候
  • 同一批分区内去重,不能跨区域去重
  • 使用order by字段作为唯一键
  • 认定重复的数据保留版本字段值最大的
  • 如果版本字段相同则按照顺序保留最后一条插入的数据

3、SummaryMergeTree引擎

对于不查询明细,只关心维度进行汇总聚合结果的场景。如果只使用普通的MergeTree,无论存储空间的开销还是临时聚合的开销都比较大(预聚合引擎)

	CREATE TABLE t_order_mt5 (
	id UInt32,
	sku_id String,
	total_amount DECIMAL ( 16, 2 ) TTL create_time + INTERVAL 10 SECOND,
	create_time Datetime 
) ENGINE = SummingMergeTree(total_amount) PARTITION BY toYYYYMMDD ( create_time ) 
PRIMARY KEY ( id ) 
ORDER BY
	( id, sku_id );
  • 分区内聚合
  • 分片合并是聚合

问题:

1、clickhouse支持事物吗?

不支持

2、clickhouse支持更新和删除吗?

可以支持修改和删除、但是Mutation语句是一种很重的操作,会生成新的临时分区目录,到合并的时候会删除老的分区

3、如何解决上述问题?

通过设置标记字段定期清理分区

4、clickhouse中支持子查询

5、clickhouse支持各种join,A表joinB表会将B表加入到缓存,然后一个个关联A表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值