实现方式:二叉平衡树
内部数据组织: DeltaMem和MemRowSet在存在中的组织方式是一致的,都是B+Tree,在磁盘上的存储都是放在CFile文件中的,以下为CFile的文件格式:
CFile包含Header,Data,Index,Footer四块,其中Data部分起始部分是为空值,仅仅针对为null的column,对应主键没有这个的null值的,bitmap就是以那些值为null的RowId建立起来的位图,这样Data就不用存储这些空值,data部分不同的column类型文件会有不同的编码方式 对于ad_hoc文件使用的prefix,delta fle使用的是plain,bloomfile使用的是plain
Index有两种,posidx index是根据rowId找到Data中的偏移,validx index是根据key的值找到data中的偏移,validx只针对只有一个column为key的情况下,这个时候DiskRowSet是没有Ad_hoc索引的,使用validx来代替。这两个index内部实现了B-Tree,index不一定是联系的,在达到一定长度后就会刷盘
Footer是记录CFile的元数据,包括posidx_index,validx_index两棵树根节点所在位置,数据条目、编码、压缩方式等
DiskRowSet数据在磁盘上分布:磁盘上每一个DiskRowSet有若干.metadata和.data文件,metadata文件记录的是DiskRowSet的元信息,主要包括哪些block和block在data中的位置,上图为block和DiskRowSet中各部分的映射关系,在写磁盘时是通过container来写入,每个container可以写很大的一块连续的磁盘空间,用于给某一个CFile写数据,当一个CFile写完后会将container归还给BlockManager,这时container就可以用于下一个CFile写数据了,当BlockManager中没有container可用是会创建一个新的container给新的CFile使用。
对应新建block先看看是否有container可用,若没有,目前默认的是在所在的配置中的data_dir中随机选取一个dir建一个新的metadata和data文件。先写data,block落盘后再写metadata
表的主键排序,受益于MVCC(Multi-Version Concurrency Control 多版本并发控制,一旦数据写入到MemRowSet,后续的reader能立马查询到
minor compaction: 多个deltafile进行合并。默认是1000个deltafile进行合并一次
major compaction:
deltafile文件的大小和basedata的文件的比例为0.1的时候,会进行合并操作
转自:https://blog.csdn.net/weixin_39478115/article/details/79267330