mongodb-query-optimizer

mongodb-query-optimizer

热门

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

162Star
30Fork
更新于 2026/7/23
SKILL.md
readonly只读
name
mongodb-query-optimizer
description

Help with MongoDB query optimization and indexing. Use only when the user asks for optimization or performance: "How do I optimize this query?", "How do I index this?", "Why is this query slow?", "Can you fix my slow queries?", "What are the slow queries on my cluster?", etc. Do not invoke for general MongoDB query writing unless user asks for performance or index help. Prefer indexing as optimization strategy. Use MongoDB MCP when available.

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 创建索引