analyzeShardKey
定義
analyzeShardKey
バージョン 7.0 で追加。
シャーディングされていないコレクションまたはシャーディングされたコレクションの シャードキー を評価するためのメトリクスを計算します。 メトリクスは、サンプリングされたクエリに基づいています。
configureQueryAnalyzer
を使用して、コレクションのクエリ サンプリングを構成できます。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、 「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
analyzeShardKey
の構文は次のとおりです。
db.adminCommand( { analyzeShardKey: <string>, key: <shardKey>, keyCharacteristics: <bool>, readWriteDistribution: <bool>, sampleRate: <double>, sampleSize: <int> } )
コマンドフィールド
フィールド | タイプ | 必要性 | 説明 |
---|---|---|---|
analyzeShardKey | string | 必須 | 分析するコレクションの 名前空間 。 デフォルト値はありません。 |
key | ドキュメント | 必須 | 分析するシャードキー。 これは、シャーディングされていないコレクションまたはシャーディングされたコレクションの候補シャードキー、またはシャーディングされたコレクションの現在のシャードキーです。 デフォルト値はありません。 |
keyCharacteristics | ブール値 | 任意 | シャードキーの特性に関するメトリクスを計算するかどうか。 詳細については、「 キーの特性 」を参照してください。 デフォルトは |
readWriteDistribution | ブール値 | 任意 | 読み取りと書込みの分布に関するメトリクスを計算するかどうか。 詳しくは、「 readWriteDistribution 」を参照してください。 デフォルトは
|
sampleRate | double | 任意 | シャードキーの特性に関するメトリクスを計算するときにサンプリングするコレクション内のドキュメントの割合。
デフォルト値はありません。 |
sampleSize | integer | 任意 | シャードキーの特性に関するメトリクスを計算するときにサンプリングするドキュメントの数。 指定されておらず、かつ |
動作
analyzeShardKey
は、メソッドの実行時に指定するkeyCharacteristic
とreadWriteDistribution
の値に応じて異なるメトリクスを返します。
シャードキーの特性に関するメトリクス
keyCharacteristic
は、シャードキーの濃度、頻度、単調性に関するメトリクスで構成されています。 これらのメトリクスは、 keyCharacteristics
が true の場合にのみ返されます。
メトリクスは、コレクションからサンプリングされたドキュメントに基づいてanalyzeShardKey
が実行されるときに計算されます。 計算では、シャードキーにサポートされているインデックスが必要です。 サポートするインデックスがない場合、メトリクスは返されません。
sampleRate
sampleSize
フィールドと フィールドを使用してサンプリングを構成できます。どちらも任意であり、指定できるのは 1 つだけです。 どちらも指定されていない場合、サンプル サイズは10
に設定されます。 この値はanalyzeShardKeyCharacteristicsDefaultSampleSize
を設定して構成します。
コレクション内のすべてのドキュメントに基づいてメトリクスを計算するには、 sampleRate
を1
に設定します。
読み取りおよび書込みの分散に関するメトリクス
readWriteDistribution
には、クエリルーティングパターンとシャードキー範囲のホットネス(アクセス頻度)に関するメトリクスが含まれています。 これらのメトリクスは、サンプリングされたクエリに基づいています。
コレクションのクエリ サンプリングを構成するには、 configureQueryAnalyzer
コマンドを使用します。 読み取り分散メトリクスと書込み分散メトリクスは、 readWriteDistribution
がtrue
の場合にのみ返されます。 メトリクスはanalyzeShardKey
が実行され、サンプリングされた読み取りおよび書込みクエリが使用されるときに計算されます。 サンプリングされたクエリがない場合、読み取りおよび書込みの分布メトリクスは返されません。
サンプリングされた読み取りクエリがない場合、コマンドは
writeDistribution
を返しますが、readDistribution
は省略します。サンプリングされた書込み (write) クエリがない場合、コマンドは
readDistribution
を返しますが、writeDistribution
は省略します。
analyzeShardKey
を使用してコレクションの読み取りと書込みの分散メトリクスを返すには、コレクションで実行されるクエリをサンプリングするようにクエリ アナライザを構成する必要があります。 それ以外の場合、 analyzeShardKey
は読み取りと書込みの分散メトリクスを0
値として返します。 クエリアナライザを構成するには、「 configureQueryAnalyzer 」を参照してください。
keyCharacteristics 値 | readWriteDistribution 値 | 返された結果 |
---|---|---|
true | false |
|
false | true | analyzeShardKey は readWriteDistribution メトリクスを返し、 メトリクスを省略します。keyCharacteristics |
true | true |
|
非ブロッキングの動作
analyzeShardKey
は、コレクションへの読み取りまたは書込みをブロックしません。
クエリ サンプリング
読み取りおよび書込みの分布に関するメトリクスの品質は、クエリのサンプリングが行われるときにワークロードがどの程度表現されているかによって決まります。 一部のアプリケーションでは、表現的なメトリクスを返すには、クエリのサンプリングを数日間オンのままにする必要がある場合があります。
サポートインデックス
analyzeShardKey
に必要なサポート インデックスは、 shardCollection
コマンドに必要なサポート インデックスと異なります。
次の表は、 analyzeShardKey
とshardCollection
の両方で同じシャードキーでサポートされているインデックスを示しています。
コマンド | シャードキー | サポートインデックス |
---|---|---|
| { a.x: 1, b: "hashed" } |
|
shardCollection | { a.x: 1, b: "hashed" } | { a.x: 1, b: "hashed", ... } |
これにより、シャーディングに必要なサポートインデックスがまだないシャードキーを分析できます。
analyzeShardKey
とshardCollection
にはどちらも次のインデックス要件があります。
サポート インデックスを作成するには、 db.collection.createIndex()
メソッドを使用します。
読み込み設定 (read preference)
パフォーマンスを最小限に抑えるには、 secondary
またはsecondaryPreferred
の読み込み設定(read preference)でanalyzeShardKey
を実行します。 シャーディングされたクラスターでは、指定されていない場合、 mongos
は自動的にsecondaryPreferred
に設定します。
制限
Atlas共有クラスターとサーバーレス インスタンスでは
analyzeShardKey
を実行できません。スタンドアロン配置では
analyzeShardKey
を実行できません。--shardsvr
レプリカセットに対してanalyzeShardKey
を直接実行することはできません。 シャーディングされたクラスターで実行する場合、analyzeShardKey
はmongos
に対して実行する必要があります。時系列コレクションに対して
analyzeShardKey
を実行することはできません。Queryable Encryptionが設定されているコレクションに対して
analyzeShardKey
を実行することはできません。
アクセス制御
analyzeShardKey
には、次のいずれかのロールが必要です。
enableSharding
分析対象のコレクションに対する特権アクション。clusterManager
ロールを使用します。
出力
analyzeShardKey
は、 key charactersとreadWriteDistributionに関する情報を返します。
keyCharacteristics
は、シャードキーの 濃度、頻度、単調性に関するメトリクスを提供します。readWriteDistribution
は、クエリ ルーティング パターンとシャードキー範囲の ホットネス(アクセス頻度) に関するメトリクスを提供します。
key characters
これは、 keyCharacteristics
がtrue
に設定されている場合に返されるkeyCharacteristics
ドキュメントの構造です。
{ keyCharacteristics: { numDocsTotal: <integer>, numOrphanDocs: <integer>, avgDocSizeBytes: <integer>, numDocsSampled: <integer>, isUnique: <bool>, numDistinctValues: <integer>, mostCommonValues: [ { value: <shardkeyValue>, frequency: <integer> }, ... ], monotonicity: { recordIdCorrelationCoefficient: <double>, type: "monotonic"|"not monotonic"|"unknown", } } }
フィールド | タイプ | 説明 | 使用法 |
---|---|---|---|
numDocsTotal | integer | コレクション内のドキュメントの数。 | |
numOrphanDocs | integer | 孤立したドキュメント の数。 | 孤立したドキュメントは、パフォーマンス上の理由でメトリクスの計算から除外されません。 numOrphanDocs がnumDocsTotal に比べて大きい場合は、孤立したドキュメントの数がコレクション内のドキュメントの総数に比べて非常に少なくなるまで待ってからコマンドを実行することを検討してください。 |
avgDocSizeBytes | integer | コレクション内のドキュメントの平均サイズ(バイト単位)。 | が numDocsTotal numDocsSampled frequency と同等の場合、各mostCommonValues の にavgDocSizeBytes を掛けて、最大チャンクのサイズを推定できます。 |
numDocsSampled | integer | サンプリングされたドキュメントの数。 | |
numDistinctValues | integer | 個別のシャードキー値の数。 | 個別のシャードキー値の数はバランサーが作成できるチャンクの最大数であるため、大きな numDistinctValues を持つシャードキーを選択します。 |
isUnique | ブール値 | シャードキーが一意であるかどうかを示します。 シャードキーに一意なインデックスがある場合にのみ、これは true に設定されます。 | シャードキーが一意の場合、個別の値の数はドキュメントの数と等しくなります。 |
mostCommonValues | ドキュメントの配列 | 上位の最も一般的なシャードキー値の 値 と frequency (ドキュメント数)の配列。 | シャードキー値の頻度は、その値を含むチャンク内のドキュメントの最小数です。 頻度が大きい場合、チャンクはストレージ、読み取り、書込みのボトルネックになる可能性があります。 最も一般的な各値の頻度が 最も一般的なシャードキー値の数は、 |
mostCommonValues[n].value | ドキュメント | シャードキー。 | |
mostCommonValues[n].frequency | integer | 特定のシャードキーのドキュメントの数。 | 最も一般的な各値の頻度が numDocsSampled に比べて低いシャードキーを選択します。 |
monotonicity.
recordIdCorrelationCoefficient | double | 単調性が既知の場合にのみ設定します。 | 次のいずれかに当てはまる場合、これは
コレクションがチャンクの移行を行った場合、単調性チェックで誤った結果が返されることがあります。 チャンク移行により、ドナー シャードからドキュメントが削除され、受信者シャードに再挿入されます。 クライアントからの挿入順序が保持される保証はありません。 |
monotoncity.type | string | 次のいずれかになります。
| 新しいドキュメントを頻繁に挿入することが予想されない限り、 単調に増加または減少するシャードキーでコレクションがシャーディングされている場合、新しいドキュメントは |
readWriteDistribution
以下は、 readWriteDistribution
がtrue
に設定されている場合に返されるドキュメントの構造です。
{ readDistribution: { sampleSize: { total: <integer>, find: <integer>, aggregate: <integer>, count: <integer>, distinct: <integer> }, percentageOfSingleShardReads: <double>, percentageOfMultiShardReads: <double>, percentageOfScatterGatherReads: <double>, numReadsByRange: [ <integer>, ... ] }, writeDistribution: { sampleSize: { total: <integer>, update: <integer>, delete: <integer>, findAndModify: <integer> }, percentageOfSingleShardWrites: <double>, percentageOfMultiShardWrites: <double>, percentageOfScatterGatherWrites: <double>, numWritesByRange: [ <integer>, ... ], percentageOfShardKeyUpdates: <double>, percentageOfSingleWritesWithoutShardKey: <double>, percentageOfMultiWritesWithoutShardKey: <double> } }
analyzeShardKey
を使用してコレクションの読み取りと書込みの分散メトリクスを返すには、コレクションで実行されるクエリをサンプリングするようにクエリ アナライザを構成する必要があります。 それ以外の場合、 analyzeShardKey
は読み取りと書込みの分散メトリクスを0
値として返します。 クエリアナライザを構成するには、「 configureQueryAnalyzer 」を参照してください。
readDistribution フィールド
フィールド | タイプ | 説明 | 使用法 |
---|---|---|---|
sampleSize.total | integer | サンプリングされた読み取りクエリの合計数 | |
sampleSize.find | integer | サンプリングされた find クエリの合計数。 | |
sampleSize.aggregate | integer | サンプリングされた aggregate クエリの合計数。 | |
sampleSize.count | integer | サンプリングされた count クエリの合計数。 | |
sampleSize.distinct | integer | サンプリングされた distinct クエリの合計数。 | |
percentageOfSingleShardReads | double | データの分散方法に関係なく、単一のシャードを対象とする読み取りの割合。 | |
percentageOfMultiShardReads | double | 複数のシャードを対象とする読み取りの割合。 | このカテゴリには、読み取りの対象となる値が 1 つのシャードに該当するようにデータが分散されている場合に、単一のシャードのみを対象とする読み取りが含まれます。 クエリが大量のデータを処理する場合、1 つのシャードではなく複数のシャードをターゲットにすることで、クエリが並列に実行され、レイテンシが低下する可能性があります。 |
percentageOfScatterGatherReads | double | データの分散方法に関係なく、スキャッター ギャザーである読み取りの割合。 | このメトリクスには、値が高いシャードキーを避けます。 スキャッター ギャザー クエリは、ターゲット データを持たないシャードには影響しませんが、パフォーマンスにはいくらか影響があります。 多数のシャードを持つクラスターでは、スキャッター ギャザー クエリのパフォーマンスは、単一のシャードを対象とするクエリよりも大幅に低くなります。 |
numReadsByRange | 整数の配列 | MinKey からMaxKey までソートされた各範囲が対象となる回数を表す数値の配列。 |
の合計が 範囲数は |
writeDistribution フィールド
フィールド | タイプ | 説明 | 使用法 |
---|---|---|---|
sampleSize.total | integer | サンプリングされた書込み (write) クエリの合計数です。 | |
sampleSize.update | integer | サンプリングされた update クエリの合計数。 | |
sampleSize.delete | integer | サンプリングされた delete クエリの合計数。 | |
sampleSize.findAndModify | integer | サンプリングされた findAndModify クエリの合計数。 | |
percentageOfSingleShardWrites | double | データの分散方法に関係なく、単一のシャードを対象とする書込みの割合。 | |
percentageOfMultiShardWrites | double | 複数のシャードを対象とする書込みの割合。 | このカテゴリには、書込みの対象となる値が単一のシャードに該当するようにデータが分散されている場合に、単一のシャードのみを対象とする書込みが含まれます。 |
percentageOfScatterGatherWrites | double | データの分散方法に関係なく、スキャッター ギャザーである書込みの割合。 | 単一のシャードを対象とする書き込みの方がパフォーマンスが向上するため、このメトリクスの値が高いシャードキーは避けてください。 |
numWritesByRange | 整数の配列 | MinKey からMaxKey までソートされた各範囲が対象となる回数を表す数値の配列。 | 書き込み用の ホット シャード が 1 つ以上ある可能性が高いことを意味するため、 の合計が 範囲数は |
percentageOfShardKeyUpdates | double | ドキュメントのシャードキー値を更新する書込みクエリの割合。 |
更新は現在、再試行可能な書込みとしてまたはトランザクション内でのみサポートされており、バッチ サイズの制限は |
percentageOfSingleWritesWithoutShardKey | double | multi=false で、単一のシャードを対象とできない書込みクエリの割合。 | このメトリクスでは、値が高いシャードキーを避けます。 このタイプの書込み (write) を実行すると、内部トランザクションの実行が含まれる可能性があるため、コストがかかります。 |
percentageOfMultiWritesWithoutShardKey | double | multi=true で、単一のシャードを対象とできない書込みクエリの割合。 | このメトリクスでは、値が高いシャードキーを避けます。 |
例
ソーシャル メディア アプリの簡素化されたバージョンを検討してください。 シャーディングしようとしているコレクションはpost
コレクションです。
post
コレクション内のドキュメントには次のスキーマがあります。
{ 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 人のプライベートユーザーがいます。
各ユーザーは他の 5 人のユーザーに依存し、少なくとも 1 人のアイドルユーザーに従う可能性が非常に高くなります。
サンプル ワークロード
各ユーザーは 1 日に約 2 回の投稿をランダムに書き込みます。 彼らは各投稿が送信された直後に、1 回編集します。
各ユーザーは 6 時間ごとにログを記録して、自分のプロファイルと過去 24 時間から追跡するユーザーによる投稿を読み取ります。 過去 3 時間のランダムな投稿 でも応答します。
アプリはすべてのユーザーに対して、3 日以上経過した投稿を午前 0 時に削除します。
ワークロード クエリ パターン
このワークロードには次のクエリ パターンがあります。
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: } }
以下は、7 日間のワークロードから収集されたサンプリングされたクエリを使用して、いくつかの候補シャードキーに対してanalyzeShardKey
によって返されるメトリクスの例です。
注意
analyzeShardKey
コマンドを実行する前に、このページの前半の「サポートされているインデックス」セクションをお読みください。 分析対象のシャードキーにサポート用インデックスが必要な場合は、 db.collection.createIndex()
メソッドを使用してインデックスを作成します。
{ lastName: 1 } key characters
このanalyzeShardKey
コマンドは、 social.post
コレクションの{ lastName: 1 }
シャードキーに関するメトリクスを提供します。
db.adminCommand( { analyzeShardKey: "social.post", key: { 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 } key characters
このanalyzeShardKey
コマンドは、 social.post
コレクションの{ userId: 1 }
シャードキーに関するメトリクスを提供します。
db.adminCommand( { analyzeShardKey: "social.post", key: { 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
このanalyzeShardKey
コマンドは、 social.post
コレクションの{ userId: 1 }
シャードキーに関するメトリクスを提供します。
db.adminCommand( { analyzeShardKey: "social.post", key: { 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 } }