db.collection.analyzeShardKey()
定义
db.collection.analyzeShardKey(key, opts)
计算用于评估未分片或分分片的集合的分片分片键的指标。 指标基于采样的查询。 您可以使用
configureQueryAnalyzer
在集合上配置查询采样。
兼容性
此方法可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
db.collection.analyzeShardKey()
采用以下语法:
db.collection.analyzeShardKey( <shardKey>, { keyCharacteristics: <bool>, readWriteDistribution: <bool>, sampleRate: <double>, sampleSize: <int> } )
字段
字段 | 类型 | 必要性 | 说明 |
---|---|---|---|
key | 文档 | 必需 | 要分析的分片键。这可以是未分片集合或分片集合的候选分片键,也可以是分片集合的当前分片键。 没有默认值。 |
opts.keyCharacteristics | 布尔 | Optional | 是否计算有关分片分片键特征的指标。 有关详细信息,请参阅keyCharacteristics。 默认值为 |
opts.readWriteDistribution | 布尔 | Optional | 是否计算写入分布的指标。 有关详细信息,请参阅readWriteDistribution。 默认值为 |
opts.sampleRate | double | Optional | 计算有关分片分片键特征的指标时,集合中要进行示例的文档所占的比例。 如果设立 必须大于 没有默认值。 |
opts.sampleSize | 整型 | Optional | 计算分片密钥特征相关指标时要采样的文档数量。如果设置 如果未指定,且未指定 |
行为
有关行为,请参阅 analyzeShardKey 行为。
访问控制
有关详细信息,请参阅analyzeShardKey 访问控制。
输出
有关输出示例,请参阅analyzeShardKey 输出。
示例
考虑一个社交媒体应用的简化版本。 我们尝试分片的集合是post
集合。
post
collection中的文档具有以下模式:
{ 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: }, ] }
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()
方法创建索引。
{ lastName: 1 } keyCharacteristics
此db.collection.analyzeShardKey
方法提供social.post
集合上的{ lastName: 1 }
分分片键的指标:
use social db.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" }, } }
{ userId: 1 } keyCharacteristics
此db.collection.analyzeShardKey
方法提供social.post
集合上的{ userId: 1 }
分分片键的指标:
use social db.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" }, } }
{ userId: 1 } readWriteDistribution
此db.collection.analyzeShardKey
命令提供social.post
集合上{ userId: 1 }
分片键的指标:
use social db.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 } }