目录
分区目录的合并过程
MergeTree的分区目录和传统意义上其他数据库有所不同。首先, MergeTree的分区目
录并不是在数据表被创建之后就存在的,而是在数据写入过程中被创建的。也就是说如果
一张数据表没有任何数据,那么也不会有任何分区目录存在。其次,它的分区目录在建立
之后也并不是一成不变的。在其他某些数据库的设计中,追加数据后目录自身不会发生变
化,只是在相同分区目录中追加新的数据文件。而 MergeTree完全不同,伴随着每一批数
据的写入(一次INSERT语句), MergeTree都会生成一批新的分区目录。即便不同批次写
入的数据属于相同分区,也会生成不同的分区目录。也就是说,对于同一个分区而言,也
会存在多个分区目录的情况。在之后的某个时刻(写入后的10~15分钟,也可以手动执行
optimize查询语句), ClickHouse会通过后台任务再将属于相同分区的多个目录合并成一个
新的目录。已经存在的旧分区目录并不会立即被删除,而是在之后的某个时刻通过后台任
务被删除(默认8分钟)。
属于同一个分区的多个目录,在合并之后会生成一个全新的目录,目录中的索引和数
据文件也会相应地进行合并。新目录名称的合并方式遵循以下规则,其中:
口 MinBlockNum:取同一分区内所有目录中最小的 MinBlockNum值。
口 MaxBlockNum:取同一分区内所有目录中最大的 MaxBlockNum值
口 Level:取同一分区内最大 Level值并加1
合并目录名称的变化过程 如下图: