面试题答案
一键面试- 索引优化:
- 分析聚合管道中的筛选条件,使用
explain
命令查看查询执行计划,确认是否有字段因缺少索引而导致全表扫描。例如,如果聚合中有$match
阶段对某个字段进行筛选,查看该字段是否有索引,若没有则使用createIndex
方法创建索引。
- 分析聚合管道中的筛选条件,使用
- 聚合管道优化:
- 减少数据量:在管道起始阶段尽量使用
$match
先筛选出必要的数据,避免后续阶段处理过多不必要数据。比如,如果最终要统计某类文档数量,先通过$match
过滤出这类文档。 - 调整阶段顺序:将开销大的操作尽量往后放。例如,
$group
操作通常开销较大,若可以先通过$match
减少数据量再进行$group
,则能提升性能。
- 减少数据量:在管道起始阶段尽量使用
- 服务器资源检查:
- CPU使用率:使用系统工具(如
top
命令)查看MongoDB服务器CPU使用率,若CPU长期处于高负载,可能需要考虑增加CPU资源或优化其他占用CPU的进程。 - 内存使用:通过MongoDB的
serverStatus
命令查看内存使用情况,确认是否有足够内存缓存数据,若内存不足,可能导致频繁磁盘I/O,影响查询性能,可考虑增加内存。
- CPU使用率:使用系统工具(如
- 分片策略审查:
- 如果是分片集群,检查分片键的选择是否合理。不合理的分片键可能导致数据分布不均衡,影响查询性能。例如,若按某个字段分片,但查询经常涉及其他字段,可能需要重新评估分片策略。
- 查看分片集群的状态,使用
sh.status()
命令,确认各分片的负载是否均衡,若不均衡,考虑进行数据迁移或调整分片策略。