@@ -4,26 +4,26 @@ title: Fuse 引擎工作原理
4
4
5
5
## Fuse 引擎
6
6
7
- Fuse 引擎是 Databend 的核心存储引擎,专为在** 云对象存储** 上高效管理 ** PB 级** 数据而优化。默认情况下,在 Databend 中创建的表会自动使用此引擎( ` ENGINE=FUSE ` )。受 Git 启发,其基于快照的设计支持强大的数据版本控制功能(如时间回溯( Time Travel)) ,并通过先进的剪枝和索引技术提供** 高查询性能 ** 。
7
+ Fuse 引擎是 Databend 的核心存储引擎,专为在** 云对象存储** 上高效管理 ** PB 级** 数据而优化。默认情况下,在 Databend 中创建的表会自动使用此引擎 ( ` ENGINE=FUSE ` )。其设计灵感源于 Git,基于快照 (Snapshot) 的设计支持强大的数据版本控制(如时间旅行 ( Time Travel)) ,并通过先进的剪枝和索引技术提供** 卓越的查询性能 ** 。
8
8
9
- 本文档阐述其核心概念与工作原理 。
9
+ 本文档将解释其核心概念和工作原理 。
10
10
11
11
## 核心概念
12
12
13
- Fuse 引擎使用三个核心结构组织数据,设计灵感源自 Git:
13
+ Fuse 引擎使用三个核心结构来组织数据,其设计与 Git 类似 :
14
14
15
- * ** 快照( Snapshot,类似 Git 提交) :** 不可变引用,通过指向特定段( Segment)定义表在时间点的状态,支持时间回溯( Time Travel) 。
16
- * ** 段( Segment,类似 Git 树) :** 块( Block) 的集合,包含用于快速数据跳过(剪枝)的汇总统计信息,可在快照间共享 。
17
- * ** 块( Block,类似 Git 对象) :** 不可变数据文件( Parquet 格式),存储实际行数据及详细的列级统计信息,用于细粒度剪枝 。
15
+ * ** 快照 ( Snapshot) ,类似 Git 的提交 (Commit) :** 不可变的引用,通过指向特定的段 ( Segment) 来定义表在某一时间点的状态,从而实现时间旅行 ( Time Travel) 等功能 。
16
+ * ** 段 ( Segment) ,类似 Git 的树 (Tree) :** 块 ( Block) 的集合,包含用于快速数据跳过(即剪枝 (Pruning))的摘要统计信息,可在不同快照间共享 。
17
+ * ** 块 ( Block) ,类似 Git 的数据对象 (Blob) :** 不可变的数据文件(采用 Parquet 格式),其中包含实际的行数据以及用于细粒度剪枝的详细列级统计信息 。
18
18
19
19
```
20
- 表头( Table HEAD)
20
+ 表头 ( Table HEAD)
21
21
│
22
22
▼
23
23
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
24
- │ 段(SEGMENT A) │◄────│ 快照 2 │────►│ 段(SEGMENT B) │
25
- │ │ │ 前一个: │ │ │
26
- └───────┬───────┘ │ 快照 1 │ └───────┬───────┘
24
+ │ 段 A │◄────│ 快照 2 │────►│ 段 B │
25
+ │ │ │ Previous: │ │ │
26
+ └───────┬───────┘ │ SNAPSHOT 1 │ └───────┬───────┘
27
27
│ └───────────────┘ │
28
28
│ │ │
29
29
│ ▼ │
@@ -41,18 +41,18 @@ Fuse 引擎使用三个核心结构组织数据,设计灵感源自 Git:
41
41
42
42
## 写入工作原理
43
43
44
- 向表添加数据时 ,Fuse 引擎会构建对象链。过程如下 :
44
+ 当您向表中添加数据时 ,Fuse 引擎会创建一系列对象。下面将逐步演示此过程 :
45
45
46
46
### 步骤 1:创建表
47
47
48
48
``` sql
49
49
CREATE TABLE git (file VARCHAR , content VARCHAR );
50
50
```
51
51
52
- 此时表无数据 :
52
+ 此时,表已创建,但其中不包含任何数据 :
53
53
54
54
```
55
- ( 空表,无数据)
55
+ ( 空表,无数据)
56
56
```
57
57
58
58
### 步骤 2:插入第一条数据
@@ -61,10 +61,10 @@ CREATE TABLE git(file VARCHAR, content VARCHAR);
61
61
INSERT INTO git VALUES (' cloud.txt' , ' 2022/05/06, Databend, Cloud' );
62
62
```
63
63
64
- 首次插入后 ,Fuse 引擎创建初始快照 、段和块:
64
+ 首次插入数据后 ,Fuse 引擎会创建初始的快照 、段和块:
65
65
66
66
```
67
- 表头( Table HEAD)
67
+ 表头 ( Table HEAD)
68
68
│
69
69
▼
70
70
┌───────────────┐
@@ -91,16 +91,16 @@ INSERT INTO git VALUES('cloud.txt', '2022/05/06, Databend, Cloud');
91
91
INSERT INTO git VALUES (' warehouse.txt' , ' 2022/05/07, Databend, Warehouse' );
92
92
```
93
93
94
- 插入新数据时 ,Fuse 引擎创建引用原始段和新段的新快照 :
94
+ 当我们插入更多数据时 ,Fuse 引擎会创建一个新的快照,该快照同时引用了原有的段和一个新的段 :
95
95
96
96
```
97
- 表头( Table HEAD)
97
+ 表头 ( Table HEAD)
98
98
│
99
99
▼
100
100
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
101
101
│ 段 A │◄────│ 快照 2 │────►│ 段 B │
102
- │ │ │ 前一个: │ │ │
103
- └───────┬───────┘ │ 快照 1 │ └───────┬───────┘
102
+ │ │ │ Previous: │ │ │
103
+ └───────┬───────┘ │ SNAPSHOT 1 │ └───────┬───────┘
104
104
│ └───────────────┘ │
105
105
│ │ │
106
106
│ ▼ │
@@ -118,28 +118,28 @@ INSERT INTO git VALUES('warehouse.txt', '2022/05/07, Databend, Warehouse');
118
118
119
119
## 读取工作原理
120
120
121
- 查询数据时 ,Fuse 引擎通过智能剪枝高效定位目标数据 :
121
+ 当您查询数据时 ,Fuse 引擎会使用智能剪枝来高效地查找数据 :
122
122
123
123
```
124
- 查询(Query): SELECT * FROM git WHERE file = 'cloud.txt';
124
+ 查询: SELECT * FROM git WHERE file = 'cloud.txt';
125
125
126
- 表头( Table HEAD)
126
+ 表头 ( Table HEAD)
127
127
│
128
128
▼
129
129
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
130
130
│ 段 A │◄────│ 快照 2 │────►│ 段 B │
131
131
│ 检查 │ │ │ │ 检查 │
132
132
└───────┬───────┘ └───────────────┘ └───────────────┘
133
133
│ ✗
134
- │ ( 跳过 - 不包含
135
- │ 'cloud.txt')
134
+ │ ( 跳过 - 不包含
135
+ │ 'cloud.txt')
136
136
▼
137
137
┌───────────────┐
138
138
│ 块 1 │
139
139
│ 检查 │
140
140
└───────┬───────┘
141
141
│
142
- │ ✓ ( 包含 'cloud.txt')
142
+ │ ✓ ( 包含 'cloud.txt')
143
143
▼
144
144
读取此块
145
145
```
@@ -148,32 +148,32 @@ INSERT INTO git VALUES('warehouse.txt', '2022/05/07, Databend, Warehouse');
148
148
149
149
```
150
150
┌─────────────────────────────────────────┐
151
- │ 查询(Query) :WHERE file = 'cloud.txt' │
151
+ │ 查询:WHERE file = 'cloud.txt' │
152
152
└─────────────────┬───────────────────────┘
153
153
│
154
154
▼
155
155
┌─────────────────────────────────────────┐
156
156
│ 检查段 A │
157
- │ 最小文件值 :'cloud.txt' │
158
- │ 最大文件值 :'cloud.txt' │
157
+ │ 文件最小值 :'cloud.txt' │
158
+ │ 文件最大值 :'cloud.txt' │
159
159
│ │
160
160
│ 结果:✓ 可能包含 'cloud.txt' │
161
161
└─────────────────┬───────────────────────┘
162
162
│
163
163
▼
164
164
┌─────────────────────────────────────────┐
165
165
│ 检查段 B │
166
- │ 最小文件值 :'warehouse.txt' │
167
- │ 最大文件值 :'warehouse.txt' │
166
+ │ 文件最小值 :'warehouse.txt' │
167
+ │ 文件最大值 :'warehouse.txt' │
168
168
│ │
169
169
│ 结果:✗ 不可能包含 'cloud.txt' │
170
170
└─────────────────┬───────────────────────┘
171
171
│
172
172
▼
173
173
┌─────────────────────────────────────────┐
174
174
│ 检查段 A 中的块 1 │
175
- │ 最小文件值 :'cloud.txt' │
176
- │ 最大文件值 :'cloud.txt' │
175
+ │ 文件最小值 :'cloud.txt' │
176
+ │ 文件最大值 :'cloud.txt' │
177
177
│ │
178
178
│ 结果:✓ 包含 'cloud.txt' │
179
179
└─────────────────┬───────────────────────┘
@@ -184,41 +184,41 @@ INSERT INTO git VALUES('warehouse.txt', '2022/05/07, Databend, Warehouse');
184
184
└─────────────────────────────────────────┘
185
185
```
186
186
187
- ## 基于快照的功能
187
+ ## 基于快照的特性
188
188
189
- Fuse 引擎的快照架构支持以下高级数据管理能力 :
189
+ Fuse 引擎的快照架构支持强大的数据管理能力 :
190
190
191
- ### 时间回溯( Time Travel)
191
+ ### 时间旅行 ( Time Travel)
192
192
193
- 查询任意历史时间点的数据状态,支持数据分支、标记和治理,并提供完整审计跟踪与错误恢复 。
193
+ 您可以查询数据在任意历史时间点的状态。此功能支持数据分支、打标和治理,并提供完整的审计追踪与错误恢复能力 。
194
194
195
- ### 零拷贝模式演进
195
+ ### 零拷贝模式演进 (Zero-Copy Schema Evolution)
196
196
197
- ** 无需重写底层数据文件 ** 即可修改表结构(添加列 、删除列、重命名、更改类型)。
197
+ 修改表结构(例如添加列 、删除列、重命名、更改类型)** 无需重写任何底层数据文件 ** 。
198
198
199
- - 变更仅为元数据操作,记录于新快照中 。
200
- - 操作瞬时完成 ,无需停机,避免高成本数据迁移,旧数据仍可通过原始模式访问 。
199
+ - 这些变更仅作为元数据操作记录在新的快照中 。
200
+ - 此操作瞬时完成 ,无需停机,并避免了昂贵的数据迁移任务。旧数据仍可通过其原始模式进行访问 。
201
201
202
- ## 查询加速的高级索引( Fuse 引擎)
202
+ ## 用于查询加速的高级索引 ( Fuse 引擎)
203
203
204
- 除基于统计信息的块 /段剪枝外,Fuse 引擎提供专用二级索引以加速特定查询模式 :
204
+ 除了利用统计信息进行基本的块 /段剪枝外,Fuse 引擎还提供专门的二级索引,以进一步加速特定的查询模式 :
205
205
206
- | 索引类型 | 简要描述 | 加速查询类型 | 示例查询片段 |
207
- | :------------------ | :-------------------------------------------------------- | :-------------------------------------------------- | :----------------------------------- --- |
208
- | ** 聚合索引( Aggregate Index) ** | 为指定分组预计算聚合结果 | 加速 ` COUNT ` 、` SUM ` 、` AVG ` ... + ` GROUP BY ` | ` SELECT COUNT(*)... GROUP BY city ` |
209
- | ** 全文索引( Full-Text Index) ** | 支持文本内关键词快速检索的倒排索引 | 使用 ` MATCH ` 的文本搜索(如日志分析) | ` WHERE MATCH(log_entry, 'error') ` |
210
- | ** JSON 索引( JSON Index) ** | 索引 JSON 文档内特定路径/键 | 针对 JSON 路径/值的过滤 | ` WHERE event_data:user.id = 123 ` |
211
- | ** 布隆过滤器索引( Bloom Filter Index) ** | 通过概率检查快速跳过不匹配块 | 点查找( ` = ` )及 ` IN ` 列表过滤 | ` WHERE user_id = 'xyz' ` |
206
+ | 索引类型 | 简要描述 | 加速的查询类型 | 查询片段示例 |
207
+ | :--- | :--- | :--- | :--- |
208
+ | ** 聚合索引 ( Aggregate Index) ** | 为指定的分组预计算聚合结果 | 加速 ` COUNT ` 、` SUM ` 、` AVG ` 等聚合函数及 ` GROUP BY ` 查询 | ` SELECT COUNT(*)... GROUP BY city ` |
209
+ | ** 全文索引 ( Full-Text Index) ** | 用于在文本中进行快速关键字搜索的倒排索引 | 使用 ` MATCH ` 的文本搜索(例如日志) | ` WHERE MATCH(log_entry, 'error') ` |
210
+ | ** JSON 索引 ( JSON Index) ** | 为 JSON 文档中的特定路径/键创建索引 | 对特定 JSON 路径/值进行过滤 | ` WHERE event_data:user.id = 123 ` |
211
+ | ** 布隆过滤器索引 ( Bloom Filter Index) ** | 通过概率性检查快速跳过不匹配的数据块 | 加速点查询 ( ` = ` ) 和 ` IN ` 列表过滤 | ` WHERE user_id = 'xyz' ` |
212
212
213
213
## 对比:Databend Fuse 引擎 vs. Apache Iceberg
214
214
215
- _ ** 注意:** 本对比聚焦 ** 表格式功能 ** 。作为 Databend 原生表格式 ,Fuse 持续演进以提升 ** 可用性与性能 ** 。功能基于当前版本,未来可能变更 。_
215
+ _ ** 注意:** 此对比专注于 ** 表格式特性 ** 。作为 Databend 的原生表格式 ,Fuse 引擎在持续演进,旨在提升 ** 易用性与性能 ** 。表中展示的功能为当前版本特性,未来可能会发生变化 。_
216
216
217
- | 功能 | Apache Iceberg | Databend Fuse 引擎 |
218
- | :---------------------- | :--------------------------------- | :-------------------------------- --- |
219
- | ** 元数据结构** | 清单列表 -> 清单文件 -> 数据文件 | ** 快照( Snapshot) ** -> 段( Segment) -> 块( Block) |
220
- | ** 统计级别 ** | 文件级(+分区(Partition)) | ** 多级** ( 快照、段、块)→ 更精细剪枝 |
221
- | ** 剪枝能力** | 良好(文件/分区统计) | ** 优秀 ** (多级统计 + 二级索引) |
222
- | ** 模式演进** | 支持(元数据更改) | ** 零拷贝** ( 仅元数据,瞬时) |
223
- | ** 数据聚簇** | 排序(写入时) | ** 自动** 优化(后台) |
224
- | ** 流式支持 ** | 基本流式摄取 | ** 高级增量 ** ( 插入/更新跟踪) |
217
+ | 特性 | Apache Iceberg | Databend Fuse 引擎 |
218
+ | :--- | :--- | :--- |
219
+ | ** 元数据结构** | 清单列表 (Manifest List) -> 清单文件 (Manifest File) -> 数据文件 (Data File) | ** 快照 ( Snapshot) ** -> 段 ( Segment) -> 块 ( Block) |
220
+ | ** 统计信息级别 ** | 文件级 (+ 分区) | ** 多级** ( 快照、段、块) → 实现更精细的剪枝 |
221
+ | ** 剪枝能力** | 良好 (基于文件/分区统计信息) | ** 卓越 ** (基于多级统计信息 + 二级索引) |
222
+ | ** 模式演进** | 支持 (元数据变更) | ** 零拷贝** ( 仅元数据,瞬时完成) |
223
+ | ** 数据聚簇** | 写入时排序 | ** 自动** 优化 (后台) |
224
+ | ** 流式处理支持 ** | 基本的流式数据摄取 | ** 高级增量处理 ** ( 插入/更新追踪) |
0 commit comments