副本集成员是否共享查询计划缓存?主备切换后新主能否访问旧主缓存?
MongoDB副本集查询计划缓存相关问题解答
副本集成员是否共享查询计划缓存?
答案是否——MongoDB副本集的每个成员都维护着自己独立的查询计划缓存,成员之间完全不会共享这个缓存。
之所以设计成这样,是因为每个节点的运行环境存在天然差异:
- 不同节点的硬件配置可能不同(比如CPU核心数、内存大小);
- 数据局部性有区别(比如从节点可能只加载了高频访问的数据到内存,索引的使用频率也和主节点不一致);
- 每个节点的查询执行历史是独立的,只有当某个节点亲自执行过查询后,才会生成对应的查询计划并存入本地缓存。
主节点选举后,新主节点能否访问原主节点的查询计划缓存?
同样是不能。当原从节点晋升为新主节点时,它的查询计划缓存还是自己作为从节点期间生成的内容——原主节点的缓存不会同步到任何其他副本集成员。
如果新主节点从未执行过某条查询,那么它第一次处理该查询时,会从头走完查询计划的生成与选择流程:评估不同的执行方案、筛选出最优路径,之后才会把这个计划存入自己的本地缓存中。
如果想让新主节点快速获得某条查询的最优计划,你可以手动在新主节点上执行一次该查询,触发计划生成和缓存;或者通过planCacheListPlans命令查看原主节点的查询计划,再结合新主节点的实际情况验证后使用。
内容的提问来源于stack exchange,提问作者Sello Mkantjwa
相关产品推荐
相关产品推荐

