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






