MongoDB 实例的 PlanCache 中存在最高效的查询索引,但在执行查询时并未选择该最优索引,导致扫描行数过多,出现大量慢查询,占用大量 CPU 内存资源,影响数据库性能。
MongoDB 4.0 实例。
MongoDB 4.0 版本的已知问题。关于该问题的更多详情,请参见 jira.mongodb.orgn extremely high 'works' value is cached。
短期解决办法
通过 PlanCache.clear()
命令清除实例的查询缓存。关于 PlanCache.clear()
命令的更多详情,请参见 PlanCache.clear()。
长期解决办法
您可以根据实际业务的查询需求进行具体分析和改进,确保设置了最适合的查询策略。如下具体改进方法供您参考:
cursor.hint()
命令对常用查询显式指定 hint 来选择该查询的最优执行计划。关于 cursor.hint()
命令的更多详情,请参见 cursor.hint()。planCacheSetFilter
参数设置查询计划缓存索引过滤器,直接为常用查询选择最优查询计划来覆盖默认查询计划。关于 planCacheSetFilter
的更多详情,请参见 planCacheSetFilter。