逻辑结构

存储引擎对比

引擎现状适用/注意
WiredTiger默认缓存≈50% RAM、压缩、支持事务
MMAPv1历史/不再使用仅作背景参考
In-Memory企业版低延迟/不持久化

WiredTiger

  • MongoDB 3.2版本起成为默认存储引擎
  • 文档级并发控制,支持多文档事务
  • 支持压缩算法(snappy和zlib)
  • 默认约占物理内存的~50%

数据模型

内嵌模型(Embedded Model)

将相关联的数据存储在同一个文档结构中。

优势

  • 查询性能高
  • 数据一致性容易保证
  • 避免复杂的join操作

适用场景

  • 数据关系为一对一或一对少
  • 内嵌数据通常需要与父文档一起查询

引用模型(Referenced Model)

通过存储对其他文档的引用来建立关联关系。

实现方式

  • 手动引用:存储目标文档的_id字段
  • DBRef引用:使用MongoDB的DBRef标准格式

适用场景

  • 数据关系为一对多或多对多
  • 关联数据需要频繁独立更新

如何选择

选择内嵌

  1. 数据对象之间有包含关系
  2. 需要经常一起读取的数据
  3. 有map-reduce、aggregation需求

选择引用

  1. 内嵌数据会导致很多数据重复
  2. 需要表达比较复杂的多对多关系
  3. 大型层次结果数据集

最小可运行示例

// 插入数据
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() 判读速查卡

字段看什么动作
stageCOLLSCAN vs IXSCAN出现COLLSCAN → 补索引
nReturned / totalDocsExamined比值比值≪1 → 重写查询/复合索引
indexName命中哪个索引调整顺序/复合字段