主题
面试题蒸馏卡:MongoDB
问题:MongoDB 和 MySQL 有什么区别?副本集和分片怎么理解?为什么选它不选 Redis/MySQL?
高频问题与标准答
1. MongoDB 是什么?为什么用?
- C++ 写的面向文档存储的分布式 NoSQL 数据库,用 BSON 存文档,是「最像关系型的 NoSQL」。
- 为什么用:架构简单无 join、模式自由快速迭代、动态查询、易扩展、内存工作区存取快。
2. MySQL 和 MongoDB 最基本的区别?
本质是关系型 vs 非关系型:MySQL 表/行/列(预定义 schema + ACID + 纵向扩展 + SQL),MongoDB 文档/集合(动态 schema + BASE + 横向扩展 + UnQl)。
3. MongoDB 的库、集合、文档是什么?
库(database)→ 集合(collection,类比表,无固定结构)→ 文档(document,类比行,一组 BSON key-value,同集合字段可不一致)。
4. MongoDB 的复制集(副本集)原理?
- 主节点记录操作到 oplog(
local.oplog.rs),从节点轮询读取重放。 - 构成:1 primary + N secondary(+ arbiter);成员数奇数。
- 主节点故障 → 选举自动切换(约 10-30s),写操作与强一致读会失败,可做最终一致读。
5. 分片(Sharding)和复制(Replication)怎么理解?
- 复制(副本集):数据冗余 + 高可用,写只在主节点,不为读性能(oplog 复制时读会阻塞)。
- 分片:数据水平切分到多节点,解决单机容量/吞吐瓶颈,提高读写性能与扩展性。
- 通常叠加:每个 shard 内部是副本集。
6. 分片集群有哪些组件?分片策略?
- 组件:Shard(存数据)/ Config Server(存 chunk 元数据)/ Query Router(mongos)(前端路由)。
- 策略:范围(Range)(范围查询高效但易不均)/ 散列(Hash)(均匀但牺牲范围查询)/ 自定义标签(Zone)。
- 平衡:拆分(split,chunk 超 64MB 一分为二) + 平衡器(balancer,块迁移)。
7. MongoDB 索引有哪些?子文档索引有什么坑?
- 类型:单字段 / 复合 / 多键(数组)/ 全文 / Hash / 通配符。
- 坑:子文档索引顺序敏感——
A:{B,C}建的索引,A:{C,B}查不到(子文档字段顺序不同视为不同)。
8. 怎么优化 MongoDB 查询?
db.setProfilingLevel(0|1|2)开分析器(1 记慢查询、2 记全部),结果存system.profile;- 分析慢查询原因:应用设计/数据模型/硬件/缺索引;
- 对症优化:建索引、改模型。
9. MongoDB 支持事务吗?存储过程呢?
- 事务:早期不支持 ACID 事务(类比 MyISAM 自动提交),4.0+ 才引入多文档事务,但仍是弱项。
- 存储过程:支持,JavaScript 编写,存
db.system.js。
10. GridFS 是什么?
存储大文件的规范——把大文件切成多个小文档(chunk)存,解决 BSON 单文档大小限制。
11. MongoDB 备份恢复怎么做?
文件快照(需 journal)/ 复制数据文件(需加锁)/ mongodump + mongorestore(逻辑备份)。
12. 为什么用 MongoDB 而不用 Redis 或 MySQL?
- vs Redis:Redis 是内存 KV 缓存,MongoDB 是持久化文档数据库,能存更复杂结构、支持丰富查询与索引。
- vs MySQL:MySQL 强事务/join/复杂 SQL;MongoDB 文档模型灵活、横向扩展、快速迭代。无事务、TB/PB 级、快速扩展选 Mongo;强一致事务选 MySQL。
追问链
- 写操作会立刻落盘吗? 不会,默认延迟写(syncPeriodSecs,默认 60s 内刷盘),靠 journal 保证崩溃恢复。
- 32 位系统有什么坑? journal 默认禁用(激活会额外内存映射文件,压缩数据库大小)。
- 子文档 A:{B,C} 和 A:{C,B} 索引互通吗? 不互通,只认字段顺序。
- 分片和副本集哪个提升读性能? 分片 + 索引;副本集读可能被 oplog 复制阻塞。
- 副本集成员数为什么建议奇数? 避免选举脑裂,偶数加 arbiter(只投票不存数据)。
常见误解
- ❌ "MongoDB 是内存数据库" —— 它持久化到磁盘,只是延迟刷盘。
- ❌ "副本集能提升读性能" —— 副本集是冗余高可用,读性能靠分片/索引。
- ❌ "MongoDB 支持事务所以能替代 MySQL" —— 事务是后来才补的弱项,强一致场景仍选关系型。
- ❌ "NoSQL 就是不用 SQL 的数据库" —— 是 Not Only SQL(不只是 SQL)。
关联
- 总览:MongoDB技术栈总览
- 副本分片:概念卡片:MongoDB副本集与分片集群
- 对比:面试题蒸馏卡:MySQL · 概念卡片:消息队列对比