当前位置:网站首页>TiFlash 源码阅读(五) DeltaTree 存储引擎设计及实现分析 - Part 2
TiFlash 源码阅读(五) DeltaTree 存储引擎设计及实现分析 - Part 2
2022-07-29 12:03:00 【InfoQ】
读


快照读
- 可以提供一定的 ACID 隔离(快照隔离级别),例如不会读出写到一半的数据
- 长时间的读和写不会互相阻塞,可以同时进行,对于读大量数据的场景比较友好
MemTableSet 的快照
for (const auto & file : column_files)
{
if (auto * m = file->tryToInMemoryFile(); m)
{
snap->column_files.push_back(std::make_shared<ColumnFileInMemory>(*m));
}
else
{
snap->column_files.push_back(file);
}
total_rows += file->getRows();
total_deletes += file->getDeletes();
磁盘上 Delta 层数据的快照
磁盘上 Stable 层数据的快照
Scan 实现

- 最底层 DeltaMergeBlockInputStream:返回合并自 MemTableSet、磁盘上的 Delta 层、磁盘上的 Stable 层这三个来源的数据流。这个流返回的数据是有序的,一定按照 (Handle, Version) 升序排列,但并不保证返回的数据一定符合给定的区间范围。
- DMRowKeyFilterBlockInputStream:依据 Handle 列的范围进行过滤并返回
- DMVersionFilterBlockInputStream:依据 Version 列的值进行 MVCC 过滤
DeltaMergeBlockInputStream

- 从各个底层流中取一行,放入最小堆中
- 从最小堆中取出当前最小的这一行(这一行一定是步骤 1 中各行里最小的),作为流输出的第一行
- 从取走行的流中补充一行到最小堆中
- 重复步骤 2
- 无论读哪一列,都需要依据 Sort Key 作为最小堆的排序依据,换句话说 Sort Key 列总是需要被读出来,哪怕它并不是用户所请求的数据列
- 基于堆的算法只能以行为单位处理,有较多的分支判断,无法充分利用 CPU 流水线

DMRowKeyFilterBlockInputStream
DMVersionFilterBlockInputStream

边栏推荐
猜你喜欢
随机推荐
DAY 25 daily SQL clock 】 【 丨 different sex daily score a total difficulty moderate 】 【
Collections.singletonList(T o)
CSDN TOP1“一个处女座的程序猿“如何通过写作成为百万粉丝博主
redis数据库基本知识学习——基础、常用
【多线程】——深入理解线程中断方式(interrupt)
puzzle(017.5)联动归位
【每日SQL打卡】DAY 21丨每个帖子的评论数【难度中等】
WordPress 重置密码
【一起学Rust | 基础篇】Rust基础——变量和数据类型
socket+websocket
MarkDown Advanced Syntax Manual
微信云托管入门与实践
1.4、栈
Basic knowledge of redis database learning - basic, commonly used
Hugo NexT V4 介绍
金仓数据库KingbaseES安全指南--6.6. SSL客户端证书认证
【每日SQL打卡】DAY 22丨页面推荐【难度中等】
DAY 20 daily SQL clock 】 【 丨 query difficulty moderate 】 【 team integral
DAY 22 丨 daily SQL clock 】 【 the average selling price of the difficulty of medium 】
WordPress 主题和插件









