面试题答案
一键面试数据分布调整
- 平衡分片数据:使用
sh.status()
命令定期检查各分片的数据分布情况,若发现不均衡,通过balancer
工具手动或自动平衡数据。例如,若某分片数据量过大,balancer
会自动将部分数据块迁移到其他负载较低的分片。 - 合理选择分片键:分析读写模式,选择合适的分片键。若读操作集中在某一范围内的数据,选择该范围相关字段作为分片键,确保数据均匀分布在各分片上。如时间序列数据,以时间字段为分片键,让不同时间段数据分布到不同分片。
查询优化
- 创建索引:针对频繁查询的字段创建索引,提高查询效率。例如,对于按用户ID查询的操作,在用户ID字段上创建索引。
- 优化查询语句:避免全表扫描,尽量使用覆盖索引查询。确保查询条件精准,减少不必要的字段返回。例如,只查询需要的字段,而非使用
find()
返回所有字段。 - 使用聚合框架:对于复杂的数据分析查询,合理运用聚合框架
$match
、$group
等操作符,优化查询逻辑,减少数据传输和处理量。
配置参数调优
- 调整副本集参数:根据集群负载情况,合理设置副本集的优先级,让优先级高的节点处理读请求,分担主节点压力。例如,对于读多写少的场景,适当增加读偏好节点。
- 网络参数优化:调整网络相关参数,如TCP缓冲区大小,减少网络延迟。在操作系统层面,修改
/etc/sysctl.conf
中的net.ipv4.tcp_rmem
和net.ipv4.tcp_wmem
参数,优化网络性能。 - 内存参数调整:合理分配MongoDB服务器的内存,确保足够的内存用于缓存数据。通过调整
--wiredTigerCacheSizeGB
参数,根据服务器内存大小和数据量,设置合适的缓存大小,提高数据读写速度。