面试题答案
一键面试存储引擎优化
- 选择合适存储引擎:
- MongoDB 4.2 及更高版本默认使用 WiredTiger 存储引擎。对于大规模数据读写场景,WiredTiger 的压缩功能可有效减少磁盘 I/O。例如,使用
snappy
压缩算法(默认),可在不影响太多性能的前提下降低磁盘空间占用,适用于读多写少场景;若写操作频繁且对空间节省要求极高,可考虑zlib
压缩算法,虽压缩率高但会增加 CPU 开销。
- MongoDB 4.2 及更高版本默认使用 WiredTiger 存储引擎。对于大规模数据读写场景,WiredTiger 的压缩功能可有效减少磁盘 I/O。例如,使用
- 配置存储引擎参数:
- 缓存配置:在
mongod.conf
文件中,可调整wiredTiger.engineConfig.cacheSizeGB
参数。对于大规模数据读写,建议将该值设置为系统物理内存的 50% - 60%,但不超过 32GB。例如,若服务器有 64GB 内存,可设置cacheSizeGB: 32
,这样能让更多热数据缓存在内存中,减少磁盘 I/O。
- 缓存配置:在
查询优化
- 索引优化:
- 分析查询语句:使用
explain()
方法分析查询语句,如db.collection.find({field: value}).explain("executionStats")
。根据分析结果,创建合适的索引。例如,若查询经常按某个字段过滤,就为该字段创建单字段索引;若查询涉及多个字段的条件组合,可创建复合索引。 - 覆盖索引:设计索引时尽量让索引覆盖查询字段,减少回表操作。例如,查询
db.collection.find({field1: value1}, {field2: 1, _id: 0})
,可创建索引db.collection.createIndex({field1: 1, field2: 1})
,这样查询结果可直接从索引中获取,提高查询效率。
- 分析查询语句:使用
- 查询路由优化:
- 标签化分片:通过给分片添加标签,并在集合上创建基于标签的分片规则,可将特定查询路由到合适的分片。例如,将按地区存储的数据,按地区标签分配到不同分片,查询时可直接路由到相应分片,减少跨分片查询开销。
- 查询负载均衡:合理配置分片键,确保数据在各分片间均匀分布,避免热点分片。若分片键选择不当,可能导致某一分片负载过高,影响整体性能。例如,选择具有高基数(不同值数量多)的字段作为分片键,像时间戳字段可进行适当处理(如哈希处理)后作为分片键,使数据更均匀分布。
配置参数优化
- 分片集群配置:
- 增加分片数量:根据数据量和读写负载预估,合理增加分片数量。例如,若数据量预计达到 PB 级别且读写负载高,可适当增加分片数量,但也不能过多,以免增加管理开销。一般建议先根据经验公式(如数据量/分片存储能力)初步确定分片数,再通过性能测试进行调整。
- 配置仲裁节点:仲裁节点不存储数据,主要用于参与选举。在副本集作为分片时,确保仲裁节点有足够资源且网络稳定,避免因仲裁节点故障影响副本集选举和数据读写。可将仲裁节点部署在与数据节点不同的网络子网,提高稳定性。
- mongos 配置:
- 调整连接池大小:在
mongos
配置文件中,可通过--connectionPoolSize
参数调整连接池大小。对于大规模数据读写,适当增大连接池大小可提高并发处理能力。例如,可将连接池大小设置为 100 - 200,具体值需根据服务器硬件和负载情况通过性能测试确定。 - 缓存配置:
mongos
可配置查询结果缓存,通过--queryCacheSizeMegabytes
参数设置缓存大小。对于读多写少场景,合理设置缓存大小可减少对后端分片的查询压力。例如,可设置为 500MB - 1GB,缓存经常查询的结果集,提高响应速度。
- 调整连接池大小:在