MongoDB 经典问题
📌 现象
- 查询慢
- explain 出现 COLLSCAN
- CPU 飙高
🧨 原因
- where / sort / lookup 字段未建索引
- 复合索引未命中左前缀
💥 影响
- 全表扫描
- 并发高时直接拖垮 MongoDB
✅ 解决方案
- explain(“executionStats”)
- 建立合适索引
- 复合索引遵循左前缀
📌 现象
db.col.find().skip(100000).limit(20)
🧨 原因
MongoDB 必须扫描并丢弃 skip 的文档
💥 影响
- IO + CPU 飙升
- 查询时间线性增长
✅ 解决方案
- 使用 _id / 时间游标分页
- 范围查询代替 skip
📌 现象
- update 很慢
- 磁盘 IO 高
🧨 原因
- WiredTiger 更新会重写文档
- 大字段频繁变更
💥 影响
- 写放大
- 锁竞争
✅ 解决方案
- 拆分文档
- 热字段单独存
- 避免频繁更新大数组
📌 现象
{ _id: { $in: [1..50000] } }
🧨 原因
MongoDB 逐条匹配
💥 影响
- 查询慢
- 内存暴涨
✅ 解决方案
- 批量分段查询
- 临时集合 join
📌 现象
{ name: /abc/ }
🧨 原因
- 无法走索引
💥 影响
- 全表扫描
✅ 解决方案
{ name: /^abc/ }
🧨 原因
- 一对多嵌套无限增长
💥 影响
- 超 16MB
- 更新慢
✅ 解决方案
- 一对多改引用
- 控制嵌套深度 ≤ 5
📌 现象
- MongoDB 内存占用极高
🧨 原因
- 每个索引都要进内存
- 数万 collection
💥 影响
- cache miss
- 性能下降
✅ 解决方案
- 合并集合
- 定期清理无用索引
📌 现象
- secondary 数据落后
🧨 原因
- 写入过快
- IO 瓶颈
- oplog 太小
💥 影响
- 读到旧数据
- 故障切换丢数据
✅ 解决方案
- 扩大 oplog
- 提升 IO
- 减少大事务
📌 现象
- 频繁选主
🧨 原因
- 网络抖动
- CPU/IO 打满
- 心跳超时
💥 影响
- 写入中断
- 服务抖动
✅ 解决方案
- 保证 3 节点以上
- 网络稳定
- 避免节点资源打满
📌 现象
- secondary 需要全量同步
🧨 原因
- oplog 被快速覆盖
💥 影响
- 长时间不可用
- IO 飙升
✅ 解决方案
- 调大 oplog(≥24h)
- 控制写入峰值
🧨 原因
- 单调递增分片键
💥 影响
- 热点 shard
- 写入不均衡
✅ 解决方案
- hashed 分片键
- 业务维度分片
📌 现象
- 延迟突然升高
🧨 原因
- balancer 在迁移 chunk
💥 影响
- IO 抢占
✅ 解决方案
- 低峰期开 balancer
- 控制 chunk 大小
🧨 原因
- MongoDB 极度依赖内存
💥 影响
- 延迟 x10
- 卡死
✅ 解决方案
vm.swappiness=1
📌 现象
- 写慢、主从延迟
🧨 原因
- HDD
- RAID5
✅ 解决方案
- SSD + RAID10
🧨 原因
- 裸奔 27017
💥 影响
- 被删库勒索
✅ 解决方案
- 启用 auth
- 最小权限
| Redis | MongoDB 对应问题 |
|---|---|
| 缓存穿透 | 无索引 COLLSCAN |
| 缓存击穿 | 正则 / 热点查询 |
| 缓存雪崩 | 分片键热点 / 主节点切换 |
| 内存溢出 | 索引过多 |
| 持久化阻塞 | 大事务 / 写放大 |
Redis 的问题集中在 缓存一致性和失效策略,MongoDB 的问题集中在 索引设计、数据模型、IO、复制集和分片架构。