1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| 合并树,支持索引与分区
示例 create table t_order_mt( id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime ) engine = MergeTree partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku_id); 注意: 这里的主键id是可以重复的,order by新版本可选的,没有设置的话会自动给你生成 主键和OrderBy必须有一个存在
MergeTree是以列文件+索引文件+表定义文件组成的,但是如果设定了分区那么这些文件就会保存到不同的分区目录中 以分区为单元做并行处理
insert into t_order_mt values (101,'sku_001',1000.00,'2020-06-01 12:00:00') , (102,'sku_002',2000.00,'2020-06-01 11:00:00'), (102,'sku_004',2500.00,'2020-06-01 12:00:00'), (102,'sku_002',2000.00,'2020-06-01 13:00:00'), (102,'sku_002',12000.00,'2020-06-01 13:00:00'), (102,'sku_002',600.00,'2020-06-02 12:00:00');
---
# 数据目录 data/default/t_order_mt/20200601_1_1_0 bin文件 数据文件 mrk文件 标记文件 标记文件在idx索引文件和bin数据文件之间起桥梁作用 以mrk2结尾的文件,表示该表启用了自适应索引间隔 primary.idx文件 主键索引文件,加快查询效率 minmax_create_time.idx 分区键的最大最小值 checksums.txt 校验文件,校验各个文件的正确性,存放各个文件的size以及hash值
PartitionId_MinBlockNum_MaxBlockNum_Level 分区值_最小分区块编号_最大分区块编号_合并层级 PartitionId 数据分区ID生成规则 数据分区规则由分区ID决定,分区ID由PARTITION BY分区键决定 根据分区键字段类型,ID生成规则可分为: 未定义分区键 没有定义PARTITION BY,默认生成一个目录名为all的数据分区,所有数据均存放在all目录下 整型分区键 分区键为整型,那么直接用该整型值的字符串形式做为分区ID 日期类分区键 分区键为日期类型,或者可以转化成日期类型 其他类型分区键 String,Float类型等,通过128位的Hash算法取其Hash值作为分区ID MinBlockNum 最小分区块编号,自增类型,从1开始向上递增 每产生一个新的目录分区就向上递增一个数字 MaxBlockNum 最大分区块编号,新创建的分区MinBlockNum等于MaxBlockNum的编号 Level 合并的层级,被合并的次数 合并次数越多,层级值越大
---
# 分区合并 再次插入上面数据信息,会发现数据目录变化为以下结构 20200601_1_1_0 20200601_3_3_0 20200602_2_2_0 20200602_4_4_0 进行合并操作 optimize table t_order_mt final;(全部分区合并) optimize table t_order_mt partition '20200601' final;(指定分区合并) 注意: 合并之后原有数据目录并不会立即删除
---
# 二级索引 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);
insert into t_order_mt2 values (101,'sku_001',1000.00,'2020-06-01 12:00:00') , (102,'sku_002',2000.00,'2020-06-01 11:00:00'), (102,'sku_004',2500.00,'2020-06-01 12:00:00'), (102,'sku_002',2000.00,'2020-06-01 13:00:00'), (102,'sku_002',12000.00,'2020-06-01 13:00:00'), (102,'sku_002',600.00,'2020-06-02 12:00:00');
GRANULARITY N是设定二级索引对于一级索引粒度的粒度 可以理解为一级索引有大量重复值,按这个total_amount进行跨步查询
clickhouse-client --send_logs_level=trace <<< 'select * from t_order_mt2 where total_amount > toDecimal32(900., 2)';
---
# TTL 列级别TTL 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设置字段不能是主键ID,必须是Datetime insert into t_order_mt3 values (101,'sku_001',1000.00,now()),(102,'sku_001',2000.00,now()+interval 1 minute),(103,'sku_001',3000.00,now());
表级别TTL alter table t_order_mt3 MODIFY TTL create_time + INTERVAL 10 SECOND;
# 这里有一些疑问没有解开,设置了TTL并没有生效 插入多条记录又有的可以生效,有的不行,很是奇怪 最终的现象就是最后一条插入数据ttl不生效,插入新的数据之后,旧数据ttl全部生效
|