Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

MongoDB 经典问题

一、开发层面常见问题

1️⃣ 索引缺失 -> COLLSCAN(等价于 Redis 穿透)

📌 现象

  • 查询慢
  • explain 出现 COLLSCAN
  • CPU 飙高

🧨 原因

  • where / sort / lookup 字段未建索引
  • 复合索引未命中左前缀

💥 影响

  • 全表扫描
  • 并发高时直接拖垮 MongoDB

✅ 解决方案

  • explain(“executionStats”)
  • 建立合适索引
  • 复合索引遵循左前缀

2️⃣ 深度分页(skip 大)-> 性能崩塌

📌 现象

db.col.find().skip(100000).limit(20)

🧨 原因

MongoDB 必须扫描并丢弃 skip 的文档

💥 影响

  • IO + CPU 飙升
  • 查询时间线性增长

✅ 解决方案

  • 使用 _id / 时间游标分页
  • 范围查询代替 skip

3️⃣ 文档过大 / 更新频繁 -> 写放大

📌 现象

  • update 很慢
  • 磁盘 IO 高

🧨 原因

  • WiredTiger 更新会重写文档
  • 大字段频繁变更

💥 影响

  • 写放大
  • 锁竞争

✅ 解决方案

  • 拆分文档
  • 热字段单独存
  • 避免频繁更新大数组

4️⃣ 大 $in 查询 -> 内存 & CPU 炸裂

📌 现象

{ _id: { $in: [1..50000] } }

🧨 原因

MongoDB 逐条匹配

💥 影响

  • 查询慢
  • 内存暴涨

✅ 解决方案

  • 批量分段查询
  • 临时集合 join

5️⃣ 正则误用(等价于缓存击穿)

📌 现象

{ name: /abc/ }

🧨 原因

  • 无法走索引

💥 影响

  • 全表扫描

✅ 解决方案

{ name: /^abc/ }

二、架构 & 数据模型问题

6️⃣ 嵌套设计错误(Embed 滥用)

🧨 原因

  • 一对多嵌套无限增长

💥 影响

  • 超 16MB
  • 更新慢

✅ 解决方案

  • 一对多改引用
  • 控制嵌套深度 ≤ 5

7️⃣ 集合 / 索引过多 -> 内存被吃光

📌 现象

  • MongoDB 内存占用极高

🧨 原因

  • 每个索引都要进内存
  • 数万 collection

💥 影响

  • cache miss
  • 性能下降

✅ 解决方案

  • 合并集合
  • 定期清理无用索引

三、集群 & 复制集问题

8️⃣ 主从延迟(Replication Lag)

📌 现象

  • secondary 数据落后

🧨 原因

  • 写入过快
  • IO 瓶颈
  • oplog 太小

💥 影响

  • 读到旧数据
  • 故障切换丢数据

✅ 解决方案

  • 扩大 oplog
  • 提升 IO
  • 减少大事务

9️⃣ 主节点频繁切换(Primary Flapping)

📌 现象

  • 频繁选主

🧨 原因

  • 网络抖动
  • CPU/IO 打满
  • 心跳超时

💥 影响

  • 写入中断
  • 服务抖动

✅ 解决方案

  • 保证 3 节点以上
  • 网络稳定
  • 避免节点资源打满

1️⃣0️⃣ Oplog 不够 -> 同步失败

📌 现象

  • secondary 需要全量同步

🧨 原因

  • oplog 被快速覆盖

💥 影响

  • 长时间不可用
  • IO 飙升

✅ 解决方案

  • 调大 oplog(≥24h)
  • 控制写入峰值

四、分片集群问题

1️⃣1️⃣ 分片键选择错误(等价 Redis 雪崩)

🧨 原因

  • 单调递增分片键

💥 影响

  • 热点 shard
  • 写入不均衡

✅ 解决方案

  • hashed 分片键
  • 业务维度分片

1️⃣2️⃣ Chunk 迁移导致抖动

📌 现象

  • 延迟突然升高

🧨 原因

  • balancer 在迁移 chunk

💥 影响

  • IO 抢占

✅ 解决方案

  • 低峰期开 balancer
  • 控制 chunk 大小

五、运维 & 系统问题(生产必踩)

1️⃣3️⃣ Swap 导致性能雪崩

🧨 原因

  • MongoDB 极度依赖内存

💥 影响

  • 延迟 x10
  • 卡死

✅ 解决方案

vm.swappiness=1

1️⃣4️⃣ 磁盘 IO 瓶颈

📌 现象

  • 写慢、主从延迟

🧨 原因

  • HDD
  • RAID5

✅ 解决方案

  • SSD + RAID10

1️⃣5️⃣ 未开启认证(安全事故)

🧨 原因

  • 裸奔 27017

💥 影响

  • 被删库勒索

✅ 解决方案

  • 启用 auth
  • 最小权限

六、MongoDB vs Redis 问题对照表

Redis MongoDB 对应问题
缓存穿透 无索引 COLLSCAN
缓存击穿 正则 / 热点查询
缓存雪崩 分片键热点 / 主节点切换
内存溢出 索引过多
持久化阻塞 大事务 / 写放大

🎯 总结

Redis 的问题集中在 缓存一致性和失效策略,MongoDB 的问题集中在 索引设计、数据模型、IO、复制集和分片架构。