逻辑结构
存储引擎对比
| 引擎 | 现状 | 适用/注意 |
|---|---|---|
| WiredTiger | 默认 | 缓存≈50% RAM、压缩、支持事务 |
| MMAPv1 | 历史/不再使用 | 仅作背景参考 |
| In-Memory | 企业版 | 低延迟/不持久化 |
WiredTiger
- MongoDB 3.2版本起成为默认存储引擎
- 文档级并发控制,支持多文档事务
- 支持压缩算法(snappy和zlib)
- 默认约占物理内存的~50%
数据模型
内嵌模型(Embedded Model)
将相关联的数据存储在同一个文档结构中。
优势:
- 查询性能高
- 数据一致性容易保证
- 避免复杂的join操作
适用场景:
- 数据关系为一对一或一对少
- 内嵌数据通常需要与父文档一起查询
引用模型(Referenced Model)
通过存储对其他文档的引用来建立关联关系。
实现方式:
- 手动引用:存储目标文档的_id字段
- DBRef引用:使用MongoDB的DBRef标准格式
适用场景:
- 数据关系为一对多或多对多
- 关联数据需要频繁独立更新
如何选择
选择内嵌
- 数据对象之间有包含关系
- 需要经常一起读取的数据
- 有map-reduce、aggregation需求
选择引用
- 内嵌数据会导致很多数据重复
- 需要表达比较复杂的多对多关系
- 大型层次结果数据集
最小可运行示例
// 插入数据
db.authors.insertMany([{_id:1,name:"李四"},{_id:2,name:"王五"}]);
db.posts.insertMany([
{_id:101,title:"MongoDB 指南", author_id:1, tags:["db","mongo"]},
{_id:102,title:"建模实践", author_id:2, tags:["design"]}
]);
// 创建索引
db.posts.createIndex({author_id:1});
// $lookup查询
db.posts.aggregate([
{$match:{tags:"db"}},
{$lookup:{from:"authors", localField:"author_id", foreignField:"_id", as:"author"}}
]);
explain() 判读速查卡
| 字段 | 看什么 | 动作 |
|---|---|---|
| stage | COLLSCAN vs IXSCAN | 出现COLLSCAN → 补索引 |
| nReturned / totalDocsExamined | 比值 | 比值≪1 → 重写查询/复合索引 |
| indexName | 命中哪个索引 | 调整顺序/复合字段 |