帮助优化 MongoDB 查询和索引。仅在用户询问优化或性能问题时使用:"如何优化这个查询?"、"如何为此建立索引?"、"为什么这个查询慢?"、"能修复我的慢查询吗?"、"我的集群上有哪些慢查询?"等。除非用户明确要求性能或索引帮助,否则不要为常规的 MongoDB 查询编写而调用。优先考虑索引作为优化策略。在可用时使用 MongoDB MCP。
MongoDB 查询优化器
何时调用此技能
仅在用户需要以下内容时调用:
- 查询/索引优化或性能帮助
- 查询慢的原因或如何加速
- 集群上的慢查询和/或如何优化它们
除非用户请求优化、慢查询或索引帮助,否则不要为常规查询编写而调用。
高级工作流程
通用性能帮助
如果用户想要检查慢查询,或寻求通用性能建议(不针对特定查询):
- 使用 MongoDB MCP 服务器的 atlas-get-performance-advisor 工具获取慢查询日志和性能顾问输出
- 基于这些信息提出建议
如果 Atlas MCP 服务器未配置,或者你没有足够的信息对正确的集群运行 atlas-get-performance-advisor,请告知用户通用性能分析需要配置 Atlas MCP 服务器和 API 凭据,并建议他们进行配置或改为询问特定查询。
针对特定查询的帮助
如果用户询问特定查询:
- 使用 collection-indexes、explain 和 find 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:filter、sort、limit;aggregate:pipeline;count:query)。可选的 verbosity:"queryPlanner"(默认)、"executionStats"、"queryPlannerExtended"、"allPlansExecution"。 |
find |
{ "database": "<db>", "collection": "<coll>", "filter": {...}, "projection": {...}, "sort": {...}, "limit": N } — database、collection 和 filter 是必需的。可选:projection、sort、limit。 |
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-indexes → explain → find(示例文档)。
collection-indexes— 使用结果的classicIndexes(每个都有name、key)检查查询是否可以使用现有索引。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。
-
检查现有集合索引:
- 调用
collection-indexes,database=store,collection=orders - 结果显示:
{_id: 1}、{status: 1}、{date: -1}
- 调用
-
运行 explain:
- 调用
explain,method=find,filter={status: 'shipped', region: 'US'},sort={date: -1},verbosity=queryPlanner和executionStats - 结果:使用
{status: 1}索引,然后内存排序,totalKeysExamined: 50000,nReturned: 100
- 调用
-
运行 find:
- 调用
find,limit=1 获取示例文档以推断 schema。
- 调用
如果 MCP Atlas 连接已配置,执行步骤 4。否则跳到步骤 5。
-
运行 atlas-get-performance-advisor:
- 尝试从 MCP 连接字符串获取集群名称,或询问用户 projectId/clusterName
- 使用 slowQueryLogs 获取过去 24 小时内 database=
store,collection=orders的慢查询日志 - 使用 suggestedIndexes 检查查询的索引建议
-
诊断: 基于 explain 输出和慢查询日志,此查询目标为 100 个文档但扫描了 50K 索引条目(选择性差:0.002)。内存排序增加了开销。索引不支持两个过滤字段或排序。
-
建议: 创建复合索引
{status: 1, region: 1, date: -1},遵循 ESR(两个等值字段,然后排序)。这消除了内存排序并通过同时过滤 status 和 region 提高了选择性。
如果 MongoDB MCP 服务器未设置,请遵循最佳索引实践。
示例工作流程 2(通用数据库性能帮助)
用户: "你能帮我优化集群上的慢查询吗?"
- 运行 atlas-get-performance-advisor:
- 尝试从连接字符串获取集群名称并推断 atlas-list-projects 中需要的项目名称;如果不确定,询问用户集群名称和项目 ID。
- 使用 slowQueryLogs 获取过去 24 小时的慢查询日志
- 使用 suggestedIndexes
- 使用 dropIndexSuggestions
- 使用 schemaSuggestions
- 诊断和建议: 基于慢查询日志和性能顾问建议,你可以在
db.orders集合上创建复合索引{status: 1, region: 1, date: -1}以优化诸如find({status: 'shipped', region: 'US'}).sort({date: -1})的查询。
检查所有性能顾问输出以及慢查询日志。提供关于改进内容和原因的信息,并关注具有最大潜在影响的建议(例如,影响最多查询的索引,或性能最差的查询)。
加载参考文件
在开始诊断和建议之前,加载参考文件。
始终加载:
references/core-indexing-principles.mdreferences/antipattern-examples.md
有条件地加载这些文件:
- 如果诊断聚合管道 →
references/aggregation-optimization.md - 如果诊断更改文档的查询,如 replaceOne、findOneAndUpdate 等 →
references/update-query-examples.md以获取 oplog 高效更新和常见更新反模式
输出
- 保持答案简短清晰:关于索引和优化建议的几句话,以及背后的理由(例如,通用索引原则、观察集群中的慢查询日志,或查看 Performance Advisor 中的建议)
- 关注影响最大的索引或优化——如果你省略了一些优化,请告知用户,并在被问及时呈现它们。
- 不要使用强烈的语言,例如说“你应该创建这些索引,它们肯定会提高应用程序性能”——解释它们是对某些查询的建议,并给出背后的理由。
- 考虑集合上已经存在多少索引(如果已知)——通常不应超过 20 个
- 仅当建议来自 Atlas Performance Advisor 时才建议删除索引
- 除非用户批准,否则不要直接通过 MCP 创建索引






