面试题答案
一键面试分析 winningPlan 确定优化方向
- 索引使用情况:查看
winningPlan
中indexName
字段,如果索引使用不合理(如全表扫描COLLSCAN
而不是索引扫描IXSCAN
),可能需要添加合适索引。例如:查询语句db.users.find({ age: 30 })
,若winningPlan
显示为全表扫描,应创建db.users.createIndex({ age: 1 })
。 - 执行顺序:关注操作的先后顺序,例如
sort
和limit
操作位置。若sort
在limit
之前且数据量较大,会对性能有影响,优化时可尽量让limit
先执行。
分析 rejectedPlans 确定优化方向
- 比较成本:
rejectedPlans
中的计划被拒绝通常是因为成本较高。对比winningPlan
和rejectedPlans
中的cost
字段,了解被拒绝计划成本高的原因,可能是索引使用不当或数据结构问题。 - 潜在优化点:某些被拒绝计划可能在特定情况下更优,例如数据分布变化时。通过分析可提前考虑应对不同场景的优化方案。
可能存在的性能瓶颈及优化策略
- 全表扫描:
- 性能瓶颈:数据量增大时,全表扫描会导致查询性能急剧下降。
- 优化策略:添加合适索引,确保查询条件能利用索引进行快速定位。
- 索引过多:
- 性能瓶颈:过多索引会增加写操作成本,因为每次写入都要更新多个索引。
- 优化策略:定期评估索引使用情况,删除不再使用的索引。
- 排序性能问题:
- 性能瓶颈:大数据量排序操作消耗大量内存和 CPU 资源。
- 优化策略:利用索引进行排序(确保排序字段在索引中且顺序一致),或者尽量减少排序的数据量,先使用
limit
限制数据量再排序。