mongodb-query-optimizer

mongodb-query-optimizer

热门

帮助优化 MongoDB 查询和索引。仅在用户询问优化或性能问题时使用:"如何优化这个查询?"、"如何为此建立索引?"、"为什么这个查询慢?"、"能修复我的慢查询吗?"、"我的集群上有哪些慢查询?"等。除非用户明确要求性能或索引帮助,否则不要为常规的 MongoDB 查询编写而调用。优先考虑索引作为优化策略。在可用时使用 MongoDB MCP。

162Star
30Fork
更新于 2026/7/23
SKILL.md
只读
名称
mongodb-query-optimizer
描述

帮助优化 MongoDB 查询和索引。仅在用户询问优化或性能问题时使用:"如何优化这个查询?"、"如何为此建立索引?"、"为什么这个查询慢?"、"能修复我的慢查询吗?"、"我的集群上有哪些慢查询?"等。除非用户明确要求性能或索引帮助,否则不要为常规的 MongoDB 查询编写而调用。优先考虑索引作为优化策略。在可用时使用 MongoDB MCP。

MongoDB 查询优化器

何时调用此技能

仅在用户需要以下内容时调用

  • 查询/索引优化性能帮助
  • 查询慢的原因如何加速
  • 集群上的慢查询和/或如何优化它们

除非用户请求优化、慢查询或索引帮助,否则不要为常规查询编写而调用。

高级工作流程

通用性能帮助

如果用户想要检查慢查询,或寻求通用性能建议(不针对特定查询):

  • 使用 MongoDB MCP 服务器的 atlas-get-performance-advisor 工具获取慢查询日志和性能顾问输出
  • 基于这些信息提出建议

如果 Atlas MCP 服务器未配置,或者你没有足够的信息对正确的集群运行 atlas-get-performance-advisor,请告知用户通用性能分析需要配置 Atlas MCP 服务器和 API 凭据,并建议他们进行配置或改为询问特定查询。

针对特定查询的帮助

如果用户询问特定查询:

  • 使用 collection-indexesexplainfind MCP 工具获取集合上的现有索引、查询的 explain() 输出以及集合中的示例文档
  • 使用 atlas-get-performance-advisor MCP 工具获取慢查询日志和性能顾问输出

然后根据收集的信息以及参考文件中的 MongoDB 最佳实践和示例提出优化建议。如果可能,优先创建完全覆盖查询的索引。如果无法使用 MongoDB MCP 服务器,仍然尝试提出建议。

MCP:可用工具

如何调用。 使用确切的工具名称作为 toolName 和单个参数对象作为 arguments 调用 MongoDB MCP 服务器。不要将工具名称作为选项、查询参数或嵌套键传递;将其作为 MCP 工具名称传递,参数作为 arguments 对象传递。完整的 MCP 服务器工具参考:MongoDB MCP Server Tools

数据库工具(当 MCP 集群连接正常时):

工具名称(确切) 参数对象
collection-indexes { "database": "<db>", "collection": "<coll>" } — 两者均为必需字符串。
explain { "database": "<db>", "collection": "<coll>", "method": [ { "name": "find", "arguments": { "filter": {...}, "sort": {...}, "limit": N } } ], "verbosity": "executionStats" }method 是一个包含一个对象的数组:name"find""aggregate""count"arguments 包含该方法的参数(例如 find:filtersortlimit;aggregate:pipeline;count:query)。可选的 verbosity"queryPlanner"(默认)、"executionStats""queryPlannerExtended""allPlansExecution"
find { "database": "<db>", "collection": "<coll>", "filter": {...}, "projection": {...}, "sort": {...}, "limit": N }databasecollectionfilter 是必需的。可选:projectionsortlimit

Atlas 工具(当 Atlas API 凭据已配置时):

工具名称(确切) 参数对象
atlas-list-projects {}{ "orgId": "<24-char hex>" }。返回项目及其 ID;用于获取 Performance Advisor 的 projectId
atlas-get-performance-advisor 必需: "projectId"(24 字符十六进制字符串)、"clusterName"(字符串,1–64 字符,字母数字/下划线/破折号)。可选: "operations" — 字符串数组,来自 "suggestedIndexes""dropIndexSuggestions""slowQueryLogs""schemaSuggestions"(仅请求你需要的);仅用于 slowQueryLogs:"since"(ISO 8601 日期时间)、"namespaces""db.coll" 字符串数组)。

对于用户问题,尝试从连接字符串和 Atlas API 获取与你正在优化的查询相关的信息。

1. 数据库连接字符串适用于 MongoDB MCP

典型流程:调用 collection-indexesexplainfind(示例文档)。

  • collection-indexes — 使用结果的 classicIndexes(每个都有 namekey)检查查询是否可以使用现有索引。
  • explain — 首先以 "queryPlanner" 模式运行以检查 COLLSCAN。如果查询使用了索引或集合非常小,再次以 "executionStats"(10 秒超时)运行以获取扫描文档数与返回文档数。

2. Atlas API 访问适用于 MongoDB MCP

如果需要项目 ID,首先调用 atlas-list-projects。然后调用 atlas-get-performance-advisor,仅使用你需要的 operations

操作值 使用场景
slowQueryLogs 获取慢查询——优先考虑最慢和最频繁的。可选:namespaces 限定集合;since 限定时间窗口。
suggestedIndexes 获取集群索引建议
dropIndexSuggestions 用户询问删除什么或减少索引开销
schemaSuggestions 用户询问与索引一起的 schema/查询结构建议

不要将 MCP 工具名称作为 operations 值传递——operations 是一个单独的参数,列出要获取的数据。

示例工作流程 1(针对特定查询的帮助)

用户: "为什么这个查询慢?db.orders.find({status: 'shipped', region: 'US'}).sort({date: -1})"

如果 MCP 数据库连接已配置且数据库和集合名称已知,执行步骤 1–3。否则跳到步骤 4。

  1. 检查现有集合索引:

    • 调用 collection-indexes,database=store,collection=orders
    • 结果显示:{_id: 1}{status: 1}{date: -1}
  2. 运行 explain:

    • 调用 explain,method=find,filter={status: 'shipped', region: 'US'},sort={date: -1},verbosity=queryPlannerexecutionStats
    • 结果:使用 {status: 1} 索引,然后内存排序,totalKeysExamined: 50000nReturned: 100
  3. 运行 find:

    • 调用 find,limit=1 获取示例文档以推断 schema。

如果 MCP Atlas 连接已配置,执行步骤 4。否则跳到步骤 5。

  1. 运行 atlas-get-performance-advisor:

    • 尝试从 MCP 连接字符串获取集群名称,或询问用户 projectId/clusterName
    • 使用 slowQueryLogs 获取过去 24 小时内 database=store,collection=orders 的慢查询日志
    • 使用 suggestedIndexes 检查查询的索引建议
  2. 诊断: 基于 explain 输出和慢查询日志,此查询目标为 100 个文档但扫描了 50K 索引条目(选择性差:0.002)。内存排序增加了开销。索引不支持两个过滤字段或排序。

  3. 建议: 创建复合索引 {status: 1, region: 1, date: -1},遵循 ESR(两个等值字段,然后排序)。这消除了内存排序并通过同时过滤 status 和 region 提高了选择性。

如果 MongoDB MCP 服务器未设置,请遵循最佳索引实践。

示例工作流程 2(通用数据库性能帮助)

用户: "你能帮我优化集群上的慢查询吗?"

  1. 运行 atlas-get-performance-advisor:
    • 尝试从连接字符串获取集群名称并推断 atlas-list-projects 中需要的项目名称;如果不确定,询问用户集群名称和项目 ID。
    • 使用 slowQueryLogs 获取过去 24 小时的慢查询日志
    • 使用 suggestedIndexes
    • 使用 dropIndexSuggestions
    • 使用 schemaSuggestions
  2. 诊断和建议: 基于慢查询日志和性能顾问建议,你可以在 db.orders 集合上创建复合索引 {status: 1, region: 1, date: -1} 以优化诸如 find({status: 'shipped', region: 'US'}).sort({date: -1}) 的查询。

检查所有性能顾问输出以及慢查询日志。提供关于改进内容和原因的信息,并关注具有最大潜在影响的建议(例如,影响最多查询的索引,或性能最差的查询)。

加载参考文件

在开始诊断和建议之前,加载参考文件。

始终加载:

  • references/core-indexing-principles.md
  • references/antipattern-examples.md

有条件地加载这些文件:

  • 如果诊断聚合管道references/aggregation-optimization.md
  • 如果诊断更改文档的查询,如 replaceOne、findOneAndUpdate 等references/update-query-examples.md 以获取 oplog 高效更新和常见更新反模式

输出

  • 保持答案简短清晰:关于索引和优化建议的几句话,以及背后的理由(例如,通用索引原则、观察集群中的慢查询日志,或查看 Performance Advisor 中的建议)
  • 关注影响最大的索引或优化——如果你省略了一些优化,请告知用户,并在被问及时呈现它们。
  • 不要使用强烈的语言,例如说“你应该创建这些索引,它们肯定会提高应用程序性能”——解释它们是对某些查询的建议,并给出背后的理由。
  • 考虑集合上已经存在多少索引(如果已知)——通常不应超过 20 个
  • 仅当建议来自 Atlas Performance Advisor 时才建议删除索引
  • 除非用户批准,否则不要直接通过 MCP 创建索引