浅谈MySQL、Hadoop、BigTable、Clickhouse数据读写机制( 二 )


2、通过 Scan Cache 和 Block Cache 这两层缓存 , 利用局部性原理 , 使得查询结果可以在缓存中找到 , 而无需访问 GFS 上的硬盘
3、经过前2步还没找到 , 会通过SSTable索引来查找 , 底层是AVL红黑树或跳表 , 随机读写都是O(log n)
1、SSTable 的文件格式是由两部分组成:
数据块(data block) , 就是实际要存储的行键、列、值以及时间戳 , 这些数据会按照行键排序分成一个个固定大小的块(block)来进行存储 。
元数据块(meta block) , 是一系列的元数据和索引信息 , 这其中包括用来快速过滤当前 SSTable 中不存在的行键的布隆过滤器 , 以及整个数据块的一些统计指标 。
另外还有针对数据块和元数据块的索引(index) , 这些索引内容 , 则分别是元数据索引块(metaindex block)和数据索引块(index block)
2、因为 SSTable 里面的数据块是顺序存储的 , 所以Major Compaction做的是一个有序链表的多路归并 , 这个过程中在磁盘上是顺序读写
Clickhouse表引擎主要是MergeTree系列 , 还有Log系列等其他引擎1、一个Table是由多个Partition组成 , 一个Partition是由多个Part组成 , Part里按column【列式存储】
2、旧数据在一个Part , 新数据会写另一个Part , 然后通过MergeTree引擎将多个Part异步合并(按排序键归并排序)
因为是按排序键已经排好序了 , 所以索引结构不需要像其他引擎设计的那么复杂;
底层是稀疏索引(默认8192为一个步长) , 通过【稀疏索引+标记的偏移量】就能很快找到Block的位置
1、Clickhouse通过【批处理+预排序】将数据提前排好序
2、Clickhouse能处理的最小单位是block , block就是一群行的集合 , 默认最大8192行组成一个block
相关资料
HDFS设计原理
日志系统:一条SQL更新语句是如何执行的?
SSTable存储引擎
Clickhouse的优化手段之block+lsm
Clickhouse索引结构
Clickhouse存储引擎
Clickhouse官方文档:MergeTree系列

经验总结扩展阅读