元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
储存引擎
▶
WiredTiger储存引擎
B树索引结构
日志与恢复机制
数据压缩算法
检查点机制
并发控制实现
▶
内存管理
缓存淘汰策略
内存池实现
Oplog内存管理
▶
存储结构
文档存储格式
索引文件组织
空间预分配策略
▶
分布式架构
▶
分片机制
数据分片策略
平衡器工作原理
▶
复制集
RAFT协议实现
选举算法细节
▶
查询优化
▶
执行引擎
查询计划缓存
索引选择算法
▶
聚合框架
流水线优化
MapReduce原理
▶
事务与一致性
▶
多文档事务
快照隔离实现
时间戳排序机制
▶
一致性模型
读写关注级别
因果一致性实现
▶
安全与备份
▶
加密机制
静态数据加密
传输层加密
▶
备份恢复
热备份原理
时间点恢复
发布时间:
2025-03-22 11:03
↑
☰
# WiredTiger B树索引结构 ## 简介 WiredTiger是MongoDB默认的存储引擎,它使用B树(B-tree)作为主要的索引数据结构。B树索引不仅能够支持高效的数据查询,还能保持数据的有序性,是数据库系统中最常用的索引结构之一。 ## B树的基本概念 ### B树的定义 B树是一种自平衡的树形数据结构,具有以下特点: 1. 每个节点最多包含M个子节点(M为B树的阶) 2. 除根节点和叶子节点外,每个节点至少包含⌈M/2⌉个子节点 3. 所有叶子节点都在同一层 4. 每个节点包含有序的键值对 ### B树vs B+树 WiredTiger实际使用的是B树的变种 - B+树,主要区别在于: - B+树的内部节点只存储键,不存储值 - B+树的叶子节点通过链表相连 - B+树的所有数据都存储在叶子节点 ## WiredTiger中的实现 ### 页面结构 WiredTiger中的B树由页面(Page)组成: 1. 内部页面(Internal Page) - 存储键和子页面的引用 - 用于导航查找 2. 叶子页面(Leaf Page) - 存储实际的键值对数据 - 通过链表相连,支持范围查询 ### 压缩优化 WiredTiger对B树页面采用了多种压缩技术: 1. 前缀压缩 - 相邻键值共享前缀 - 只存储不同的部分 2. 游程编码 - 压缩重复值 - 减少存储空间 ### 并发控制 WiredTiger使用乐观并发控制: 1. 读操作 - 无锁访问 - 通过事务ID验证数据版本 2. 写操作 - 写意向锁定 - Copy-on-write避免阻塞读 ## 索引操作 ### 查询过程 1. 从根节点开始,根据键值比较向下遍历 2. 在内部节点中二分查找下一层 3. 到达叶子节点后定位具体数据 ### 插入过程 1. 定位到目标叶子节点 2. 如果节点未满,直接插入 3. 节点已满则分裂: - 创建新节点 - 平均分配数据 - 更新父节点 ### 删除过程 1. 定位目标数据 2. 标记删除 3. 可能触发节点合并: - 当节点数据过少 - 与兄弟节点合并 - 更新父节点 ## 性能优化 ### 缓存管理 1. 页面缓存 - LRU淘汰策略 - 预读机制 2. 元数据缓存 - 热点页面信息 - 避免频繁磁盘访问 ### 批量操作 1. 批量插入优化 - 延迟分裂 - 批量更新父节点 2. 批量删除优化 - 延迟合并 - 懒惰空间回收 ## 总结 WiredTiger的B树索引结构通过精心的设计和优化,实现了高效的数据组织和访问。它的主要优势包括: 1. 良好的查询性能 2. 有序数据支持 3. 高并发访问 4. 空间利用率高 理解B树索引的工作原理,有助于我们更好地使用MongoDB,创建合适的索引来提升应用性能。