ClickHouse使用(三)

一、数据分区

分区以目录形式组织,每个分区独立分开存储。

1.分区ID的生成逻辑

(1)不指定分区=指定了一个名称为all的分区
(2)如果分区键取值属于整型,并且无法转换为日期格式,按照该整形的字符形式输出
(3)如果能转换成日期格式的日期类型或者整形,按照日期格式输出
(4)其他类型(String,Float)通过128位的Hash算法取其Hash值作为分区ID的取值

2.例子:

(1)无 all
(2)年龄 18,19,20 (分区1:18;分区2:19;分区3:20)
(3)日期 2019-05-01,2019-05-02,2019-05-03 (分区1:20190501;分区2:20190502;分区3:20190503)
或者 日期 2019-05-01,2019-05-02,2019-05-03 to YYYYMM (分区1:201905)
(4)其他 www.ziroom.com (分区1:hash(www.ziroom.com))

多个字段
PARTITION BY (length(Code),EventTime) 分区ID为 2-20190501

3.分区目录的命名规则

PartitionID MinBlockNum MaxBlockNum Level
201905 _ 1 _ 1 _ 0
201906 _ 2 _ 2 _ 0
(1).PartitionID(分区ID)
(2).MinBlockNum (最小数据块编号)MaxBlockNum(最大数据块编号),在单张MergeTree表内全局累加 从1开始,每增加一个分区目录n就会+1,新分区目录 MinBlockNum = MaxBlockNum)
(3).Level合并层级,某个分区被合并的次数

4.分区目录合并过程

(1).分区目录是在数据插入(Insert)的过程中创建的,每次Insert都会生成一批新的分区目录,(10-15分钟,可手动)通过后台线程合并分区目录;旧的分区目录会在 8分钟(默认)后被删除
(2).同一个分区的多个目录合并后生成全新目录,索引和数据文件也会相应的合并
(3).新目录名称合并方式
MinBlockNum(同一分区所有目录中的最小值)
MaxBlockNum(同一分区所有目录中的最大值)
Level(同一分区最大Level+1)
(4).分区目录发生合并后,旧的分区目录没有删除,但激活状态,设置为active=0,数据查询是会自动过滤掉

5.一级索引

(1).primary key 和 order by 定义相同时,primary.idx 索引文件 和 .bin 数据文件会按照完全相同的规则排序 ,每隔 8192 条数据,创建一条索引
(2).稀疏索引,标记段数据,用少量索引数据标记大量数据
(3).索引粒度 索引文件 .idx 数据标记文件 .mrk 数据文件的间隔粒度相同。
(4) .bin 会按照 index_granularity 间隔粒度生成压缩数据块

6.索引生成规则

(1)primary.idx(索引文件) CounterID.bin(主键数据文件)
编号0(CounterID.bin中第1条数据值,如第一条数据CountID取值为57),
编号1(CounterID.bin中第8192条数据值,如CountID取值为1635)
编号2(CounterID.bin中第16384(8192*2)条数据值,如CountID取值为3266

primary.idx 中的数据将会是 5716353266(系数索引的存储紧凑,这是ClickHouse的设计风格),类似的设计很多

(2)当时用两列作为索引值时,将两列值拼在一起作为稀疏索引值
如:按照CountID+日期
primary.idx 中的数据将会是 572014-03-1716352014-03-2032662014-03-19(系数索引的存储紧凑,这是ClickHouse的设计风格),类似的设计很多

7.索引查询过程

MarkRange(每个固定的index_granularity)就称为一个MarkRange [start,end] 每个MarkRange 包含【最小索引,最大索引】,如index_granuarity=3 1到189为 0,3,6,9… 64个MarkRange
(1)生成查询条件区间:ID=‘3’to [3,3] ;ID>0 (0,+inf) ; ID <‘188’ (+inf,188) ; ID like ‘6%’ [6,7)
(2)递归交集判断 将最大区间【0,+inf】,按照步长8个(默认),MarkRange拆分成多个组,与第一步中的条件区间,取交集,没有匹配到的去掉;对剩余的组按照最小步长1,与第一步周的条件区间取交集
没有成功匹配的去掉,查出所有的MarkRange
(3)合并MarkRange区间,合并范围

如上述 where ID = ‘3’,匹配到 MarkRange1【1,3】 MarkRange2【3,6】

8.二级索引(目的也是减少查询时数据扫描的范围),默认关闭,如果开启,会生成对应的索引文件

(1)minmx索引 记录 一段数据的最大值 和 最小值
(2)set索引 记录字段唯一值 max_rows=0 标识可以记录无限多值,set(max_rows)
(3)ngrambf_v1 支持 String 和FixedString 原理是 布隆过滤器 ,优化 in notIn like ,equals,notEquals查询性能
(4)tokenbf_v1 (3)的变种

二、数据存储

1.各列独立存储

按照分区,每个列一个单独的.bin数据文件(压缩后,按照Order By 排序后存储,LZ4 默认压缩算法)

2.压缩数据块

头信息和数据:
头信息(9字节)UInt8(压缩算法) UInt32(压缩前大小) UInt32(压缩后大小)
单个.bin 文件,由多个压缩数据块组成,每个压缩数据块都被控制在(64KB-1M),按照写入顺序收尾相接,排列在一起

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值