Skip to content

面试题蒸馏卡: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 的复制集(副本集)原理?

  • 主节点记录操作到 oploglocal.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 查询?

  1. db.setProfilingLevel(0|1|2) 开分析器(1 记慢查询、2 记全部),结果存 system.profile
  2. 分析慢查询原因:应用设计/数据模型/硬件/缺索引;
  3. 对症优化:建索引、改模型。

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。

追问链

  1. 写操作会立刻落盘吗? 不会,默认延迟写(syncPeriodSecs,默认 60s 内刷盘),靠 journal 保证崩溃恢复。
  2. 32 位系统有什么坑? journal 默认禁用(激活会额外内存映射文件,压缩数据库大小)。
  3. 子文档 A:{B,C} 和 A:{C,B} 索引互通吗? 不互通,只认字段顺序。
  4. 分片和副本集哪个提升读性能? 分片 + 索引;副本集读可能被 oplog 复制阻塞。
  5. 副本集成员数为什么建议奇数? 避免选举脑裂,偶数加 arbiter(只投票不存数据)。

常见误解

  • ❌ "MongoDB 是内存数据库" —— 它持久化到磁盘,只是延迟刷盘。
  • ❌ "副本集能提升读性能" —— 副本集是冗余高可用,读性能靠分片/索引。
  • ❌ "MongoDB 支持事务所以能替代 MySQL" —— 事务是后来才补的弱项,强一致场景仍选关系型。
  • ❌ "NoSQL 就是不用 SQL 的数据库" —— 是 Not Only SQL(不只是 SQL)。

关联

最近更新