You need to enable JavaScript to run this app.
导航

为什么有时实例并没有选择最优索引?

最近更新时间2023.11.07 10:27:40

首次发布时间2023.11.07 10:27:40

问题现象

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