如何根据不同情况应用/选择getPlanCache()和hint()

时间:2018-09-30 07:54:34

标签: mongodb mongodb-query

我已经阅读了官方文档,以获取有关getPlanCache()和hint()的基本思想。

  • getPlanCache()

显示指定查询形状的缓存查询计划。

查询优化器仅缓存那些具有多个可行计划的查询形状的计划。

官方文档:https://docs.mongodb.com/manual/reference/method/PlanCache.getPlansByQuery/

  • 提示()

$ hint运算符强制查询优化器使用特定索引来满足查询。通过索引名称或文档指定索引。

官方文档:https://docs.mongodb.com/manual/reference/operator/meta/hint/

我的问题

如果我可以确保特定的集合可以缓存计划,则不需要使用hint()来确保优化的性能。正确吗?

1 个答案:

答案 0 :(得分:1)

  

我已经阅读了官方文档,以获取有关getPlanCache()和hint()的基本思想。

要清楚:这些是调查查询性能的故障排除帮助。 MongoDB query planner根据执行给定查询形状所涉及的“工作”量度来选择最有效的计划。如果只有一个可行的计划,则无需缓存计划选择。如果有多个查询计划可用于同一查询形状,则查询计划者将定期评估性能,并在适当时更新缓存的计划选择。

query plan cache methods允许您检查和清除计划缓存中的信息。通常,您只希望在调查开发/分阶段环境中的问题时清除计划缓存,因为这可能会对繁忙的部署产生明显影响。

  

如果我可以确保特定的集合可以缓存计划,则不需要使用hint()来确保优化的性能。正确吗?

通常,您应该避免使用hint(在测试查询计划之外),因为这会绕过查询计划程序,即使可能有更有效的索引可用,也会强制使用提示的索引。

如果特定查询未按预期执行,则explain() output是了解查询计划过程的最佳起点。如果您不确定如何优化特定查询,建议您在DBA StackExchange上发布问题,包括explain(true)的输出(详细解释)和您的MongoDB服务器版本。

有关有用的演示,请参见:Reading the .explain() Output - Charlie Swanson(2017年6月)。