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表