对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

db. 集合.analyzeShardKey()(mongosh方法)

db.collection.analyzeShardKey(key, opts)

计算用于评估未分片或分分片的集合的分片分片键的指标。 指标基于采样的查询。 您可以使用configureQueryAnalyzer在集合上配置查询采样。

此方法可用于以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

重要

M0 和 Flex 集群不支持此命令。有关更多信息,请参阅不支持的命令。

db.collection.analyzeShardKey() 采用以下语法:

db.collection.analyzeShardKey( <shardKey>, { keyCharacteristics: <bool>, readWriteDistribution: <bool>, sampleRate: <double>, sampleSize: <int> } )
字段
类型
必要性
说明

key

文档

必需

要分析的分片键。这可以是未分片集合或分片集合的候选分片键,也可以是分片集合的当前分片键。

没有默认值。

opts.keyCharacteristics

布尔

Optional

是否计算有关分片分片键特征的指标。 有关详细信息,请参阅keyCharacteristics。

默认值为 true。

opts.readWriteDistribution

布尔

Optional

是否计算写入分布的指标。 有关详细信息,请参阅readWriteDistribution。

默认值为 true。

opts.sampleRate

double

Optional

计算有关分片分片键特征的指标时,集合中要进行示例的文档所占的比例。 如果设立sampleRate ,则无法设立sampleSize 。

必须大于 0,直至并包括 1。

没有默认值。

opts.sampleSize

整型

Optional

计算分片密钥特征相关指标时要采样的文档数量。如果设置 sampleSize,则无法设置 sampleRate。

如果未指定,且未指定 sampleRate,则样本大小默认为 analyzeShardKeyCharacteristicsDefaultSampleSize 设置的样本大小。

有关行为,请参阅 analyzeShardKey 行为。

有关详细信息,请参阅analyzeShardKey 访问控制。

有关输出示例,请参阅analyzeShardKey 输出。

考虑一个社交媒体应用的简化版本。 我们尝试分片的集合是post集合。

postcollection中的文档具有以下模式:

{ userId: <uuid>, firstName: <string>, lastName: <string>, body: <string>, // the field that can be modified. date: <date>, // the field that can be modified.}
  • 该应用有 1500 个用户。

  • 有 30 个姓氏和 45 个名字,其中一些更常见。

  • 其中有 3 名名人用户。

  • 每个用户恰好关注了另外五个用户,并且很有可能关注至少一个名人用户。

  • 每个用户每天在随机时间发布大约两个帖子。 他们在每个帖子发布后立即编辑一次。

  • 每个用户每六个小时登录一次,以阅读自己的个人资料以及过去 24 小时关注的用户发布的帖子。 他们还会在过去三个小时内随机发布的帖子下进行回复。

  • 对于每个用户,该应用程序都会在午夜删除超过三天的帖子。

此工作负载具有以下查询模式:

  • find 带筛选器的命令 { userId: , firstName: , lastName: }

  • find 带筛选器的命令 { $or: [ { userId: , firstName: , lastName: , date: { $gte: } }, ... , { userId: , date: } ] }

  • findAndModify 带筛选器{ userId: , firstName: , lastName: , date: }的命令,以更新正文和日期字段。

  • update 命令(包含multi: false和筛选器{ userId: , firstName: , lastName: , date: { $gte: , $lt: } }以更新正文和日期字段。

  • delete 附带multi: true和筛选器{ userId: , firstName: , lastName: , date: { $lt: } }的命令

以下是 db.collection.analyzeShardKey 方法为某些候选分片键返回的示例指标,以及从 7 天的工作负载中收集的采样查询。

注意

在运行db.collection.analyzeShardKey 方法之前,请阅读支持索引部分。如果您需要为正在分析的分片键提供支持索引,请使用db.collection.createIndex() 方法创建索引。

此示例使用 db.collection.analyzeShardKey 方法提供 social.post集合上 { _id: 1 }分片键的指标。

以下代码区块使用db.collection.configureQueryAnalyzer() 打开查询采样:

use socialdb.post.configureQueryAnalyzer( { mode: "full", samplesPerSecond: 5 })

在 db.collection.configureQueryAnalyzer() 收集查询样本后,以下代码区块使用 db.collection.analyzeShardKey 方法对 10、000 文档示例并计算结果:

use socialdb.post.analyzeShardKey( { _id: 1 }, { keyCharacteristics: true, readWriteDistribution: false, sampleSize: 10000 })

此db.collection.analyzeShardKey方法提供social.post集合上的{ lastName: 1 }分分片键的指标:

use socialdb.post.analyzeShardKey( { lastName: 1 }, { keyCharacteristics: true, readWriteDistribution: false })

此示例的输出如下所示:

{ "keyCharacteristics": { "numDocsTotal" : 9039, "avgDocSizeBytes" : 153, "numDocsSampled" : 9039, "isUnique" : false, "numDistinctValues" : 30, "mostCommonValues" : [ { "value" : { "lastName" : "Smith" }, "frequency" : 1013 }, { "value" : { "lastName" : "Johnson" }, "frequency" : 984 }, { "value" : { "lastName" : "Jones" }, "frequency" : 962 }, { "value" : { "lastName" : "Brown" }, "frequency" : 925 }, { "value" : { "lastName" : "Davies" }, "frequency" : 852 } ], "monotonicity" : { "recordIdCorrelationCoefficient" : 0.0771959161, "type" : "not monotonic" }, }}

此db.collection.analyzeShardKey方法提供social.post集合上的{ userId: 1 }分分片键的指标:

use socialdb.post.analyzeShardKey( { userId: 1 }, { keyCharacteristics: true, readWriteDistribution: false })

此示例的输出如下所示:

{ "keyCharacteristics": { "numDocsTotal" : 9039, "avgDocSizeBytes" : 162, "numDocsSampled" : 9039, "isUnique" : false, "numDistinctValues" : 1495, "mostCommonValues" : [ { "value" : { "userId" : UUID("aadc3943-9402-4072-aae6-ad551359c596") }, "frequency" : 15 }, { "value" : { "userId" : UUID("681abd2b-7a27-490c-b712-e544346f8d07") }, "frequency" : 14 }, { "value" : { "userId" : UUID("714cb722-aa27-420a-8d63-0d5db962390d") }, "frequency" : 14 }, { "value" : { "userId" : UUID("019a4118-b0d3-41d5-9c0a-764338b7e9d1") }, "frequency" : 14 }, { "value" : { "userId" : UUID("b9c9fbea-3c12-41aa-bc69-eb316047a790") }, "frequency" : 14 } ], "monotonicity" : { "recordIdCorrelationCoefficient" : -0.0032039729, "type" : "not monotonic" }, }}

此db.collection.analyzeShardKey方法提供social.post集合上的{ userId: 1 }分分片键的指标:

use socialdb.post.analyzeShardKey( { userId: 1 }, { keyCharacteristics: false, readWriteDistribution: true })

此示例的输出如下所示:

{ "readDistribution" : { "sampleSize" : { "total" : 61363, "find" : 61363, "aggregate" : 0, "count" : 0, "distinct" : 0 }, "percentageOfSingleShardReads" : 50.0008148233, "percentageOfMultiShardReads" : 49.9991851768, "percentageOfScatterGatherReads" : 0, "numReadsByRange" : [ 688, 775, 737, 776, 652, 671, 1332, 1407, 535, 428, 985, 573, 1496, ... ], }, "writeDistribution" : { "sampleSize" : { "total" : 49638, "update" : 30680, "delete" : 7500, "findAndModify" : 11458 }, "percentageOfSingleShardWrites" : 100, "percentageOfMultiShardWrites" : 0, "percentageOfScatterGatherWrites" : 0, "numWritesByRange" : [ 389, 601, 430, 454, 462, 421, 668, 833, 493, 300, 683, 460, ... ], "percentageOfShardKeyUpdates" : 0, "percentageOfSingleWritesWithoutShardKey" : 0, "percentageOfMultiWritesWithoutShardKey" : 0 }}