ClickHouse的数据存储以及检索过程

2019-10-25  本文已影响0人  白奕新

1、概念

bin文件的存储方式
索引中的mark index 压缩数据index 在压缩数据块中起始的字节数(偏移量)
0 0 0
1 0 12001
2 1 0

2、数据存储

3、检索过程

以 where partition = '2019-10-23' and ID >= 10 and ID < 100 (ID是索引字段)的query描述大体检索流程:

  1. 每个索引都有对应的min/max的partition值,存储在内存中。当contition带上partition时就可以从这些block列表中找到需要检索的索引,找到对应的数据存储文件夹,命中对应的索引(primary.idx)
  2. 根据ID字段,把条件转化为[10,100)的条件区间,再把条件区间与这个partition对应的稀疏索引做交集判断。如果没有交集则不进行具体数据的检索;如果有交集,则把稀疏索引等分8份,再把条件区间与稀疏索引分片做交集判断,直到不能再拆分或者没有交集,则最后剩下的所有条件区间就是我们要检索的block值。
  3. 通过步骤2我们得到了我们要检索的block值。通过上面我们知道存在多个block压缩在同一个压缩数据块的情况并且一个bin文件里面又存在N个压缩数据的情况,所以不能直接通过block的值直接到bin文件中搜寻数据。我们通过映射block值到mrk中,通过mrk知道这个block对应到的压缩数据以及在压缩数据块里面的字节偏移量,就得到了我们最后需要读取的数据地址。
  4. 把bin文件中的数据读取到内存中,找到对应的压缩数据,直接从对应的起始偏移量开始读取数据。

4、example

(1)写入

假设表的index字段为Column A,一个Column A的字符长度为30KB;还有个非index字段Column B,一个Column B的字符长度为100KB;index_granularity=2。
依7次写入7行数据,数据如下

A B
a 1
a 3
b 2
b 2
c 1
a 4
a 0

写入以后假设已经完全merge,则排序后为:

A B
a 0
a 1
a 3
a 4
b 2
b 2
c 1

则生成的索引为:

mark number value
0 a
1 a
2 b
3 c
(2)存储

根据压缩数据的64KB~1MB的理论,则在
Column A.bin文件中,对应的存储为:


image.png

(3个block才大于64KB,生成一个压缩数据块)
Column A.mrk文件中,对应的存储为:

索引中的mark number 压缩数据index 在压缩数据块中起始的字节数(偏移量)
0 0 0
1 0 61440(30 * 1024 * 2)
2 1 30720
3 2 0

同理有Column B.mrk文件为:


image.png

Column B.bin文件为:

索引中的mark number 压缩数据index 在压缩数据块中起始的字节数(偏移量)
0 0 0
1 1 0
2 2 0
3 3 0
4 4 0
5 5 0
6 6 0
(3)搜索

以A='a'为例,则命中的索引mark number为0跟1。
再返回回来mrk文件中,以(0,0)代表压缩数据块0,偏移量0。例如对于Column A而言,mark number 0则命中[(0,0),(0,61440))对应的block,mark number 1命中了[(0,61441),(1,30720))对应的block。将这些block加载进内存,再通过偏移量计算,得到最终需要扫描的行。

5、other

6、reference

朱凯老师的分享,in ClickHouse Meetup

上一篇 下一篇

猜你喜欢

热点阅读