定義
analyzeShardKeyバージョン7.0の新機能。
シャーディングされていないコレクションまたはシャーディングされたコレクションの シャードキー を評価するためのメトリクスを計算します。 メトリクスは、サンプリングされたクエリに基づいています。
configureQueryAnalyzerを使用して、コレクションでクエリ サンプリングを構成できます。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のための完全管理サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
analyzeShardKey の構文は次のとおりです。
db.collection.analyzeShardKey( <shardKey>, { keyCharacteristics: <bool>, readWriteDistribution: <bool>, sampleRate: <double>, sampleSize: <int> } )
コマンドフィールド
フィールド | タイプ | 必要性 | 説明 |
|---|---|---|---|
| ドキュメント | 必須 | 分析するシャードキー。 これは、シャーディングされていないコレクションまたはシャーディングされたコレクションの候補シャードキー、またはシャーディングされたコレクションの現在のシャードキーです。 デフォルト値はありません。 |
| ブール値 | 任意 | Whether or not the metrics about the characteristics of the shard key are calculated. For details, see keyCharacteristics. デフォルトは |
| ブール値 | 任意 | Whether or not the metrics about the read and write distribution are calculated. For details, see readWriteDistribution. デフォルトは To return read and write distribution metrics for a collection using |
| double | 任意 | シャードキーの特性に関するメトリクスを計算するときにサンプリングするコレクション内のドキュメントの割合。
デフォルト値はありません。 |
| integer | 任意 | シャードキーの特性に関するメトリクスを計算するときにサンプリングするドキュメントの数。 指定されておらず、かつ |
動作
analyzeShardKey は、メソッドの実行時に指定する keyCharacteristic と readWriteDistribution の値に応じて異なるメトリクスを返します。
シャードキーの特性に関するメトリクス
keyCharacteristic は、シャードキーの濃度、頻度、単調性に関するメトリクスで構成されています。 これらのメトリクスは、 keyCharacteristicsが true の場合にのみ返されます。
The metrics are calculated when analyzeShardKey command is run based on documents sampled from the collection. The calculation requires the shard key to have a supporting index. If there is no supporting index, no metrics are returned.
sampleRate フィールドと sampleSize フィールドを使用してサンプリングを構成できます。どちらも任意ですが、指定できるのは 1 つだけです。sampleRate と sampleSize の両方が指定されていない場合、 MongoDB はanalyzeShardKeyCharacteristicsDefaultSampleSize パラメータの値を使用します。このパラメータのデフォルト値は 1000 万です。
コレクション内のすべてのドキュメントに基づいてメトリクスを計算するには、 sampleRateを1に設定します。
読み取りおよび書込みの分散に関するメトリクス
readWriteDistribution には、クエリルーティングパターンとシャードキー範囲のホットネス(アクセス頻度)に関するメトリクスが含まれています。 これらのメトリクスは、サンプリングされたクエリに基づいています。
To configure query sampling for a collection, use the configureQueryAnalyzer command. The read and write distribution metrics are only returned if readWriteDistribution is true. The metrics are calculated when analyzeShardKey command is run and the metrics use the sampled read and write queries. If there are no sampled queries, read and write distribution metrics aren't returned.
サンプリングされた読み取りクエリがない場合、コマンドは
writeDistributionを返しますが、readDistributionは省略します。サンプリングされた書込み (write) クエリがない場合、コマンドは
readDistributionを返しますが、writeDistributionは省略します。
To return read and write distribution metrics for a collection using analyzeShardKey, you must configure the query analyzer to sample the queries run on the collection. Otherwise, analyzeShardKey returns the read and write distribution metrics as 0 values. To configure the query analyzer, see configureQueryAnalyzer (database command).
keyCharacteristics 値 | readWriteDistribution 値 | 返された結果 |
|---|---|---|
|
|
|
|
|
|
|
|
|
非ブロッキングの動作
analyzeShardKey コマンドは、コレクションへの読み取りまたは書き込みをブロックしません。
クエリ サンプリング
読み取りおよび書込みの分布に関するメトリクスの品質は、クエリのサンプリングが行われるときにワークロードがどの程度表現されているかによって決まります。 一部のアプリケーションでは、表現的なメトリクスを返すには、クエリのサンプリングを数日間オンのままにする必要がある場合があります。
サポートインデックス
analyzeShardKeyコマンドに必要なサポート インデックスは、 shardCollectionコマンドに必要なサポート インデックスと異なります。
次の表は、analyzeShardKey コマンドと shardCollection の両方で同じシャードキーのサポートインデックスを示しています。
コマンド | シャードキー | サポートインデックス |
|---|---|---|
|
|
|
|
|
|
これにより、シャーディングに必要なサポートインデックスがまだないシャードキーを分析できます。
Both analyzeShardKey command and shardCollection have the following index requirements:
サポート インデックスを作成するには、 db.collection.createIndex()メソッドを使用します。
読み込み設定 (read preference)
パフォーマンスを最小限に抑えるには、secondary または secondaryPreferred の読み込み設定 (read preference)で analyzeShardKey コマンドを実行します。シャーディングされたクラスターでは、指定されていない場合、mongos は読み込み設定 (read preference)を自動的に secondaryPreferred に設定します。
制限
You cannot run
analyzeShardKeycommand on Atlas flex clusters.スタンドアロン配置では
analyzeShardKeyコマンドを実行することはできません。--shardsvrレプリカセットに対してanalyzeShardKeyコマンドを直接実行することはできません。シャーディングされたクラスターで実行する場合、analyzeShardKeyコマンドはmongosに対して実行する必要があります。You cannot run
analyzeShardKeycommand against time series collections.Queryable Encryption が設定されているコレクションに対して
analyzeShardKeyを実行することはできません。
アクセス制御
db.collection.analyzeShardKey メソッドには、次のいずれかのロールが必要です。
enableSharding分析対象のコレクションに対する特権アクション。clusterManagerロールを使用します。
出力
analyzeShardKey command returns information regarding keyCharacteristics and 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", } } }
フィールド | タイプ | 説明 | 使用法 |
|---|---|---|---|
| integer | コレクション内のドキュメントの数。 | |
| integer | 孤立したドキュメント の数。 | 孤立したドキュメントは、パフォーマンス上の理由でメトリクスの計算から除外されません。 |
| integer | コレクション内のドキュメントの平均サイズ(バイト単位)。 | が |
| integer | サンプリングされたドキュメントの数。 | |
| integer | 個別のシャードキー値の数。 | 個別のシャードキー値の数はバランサーが作成できるチャンクの最大数であるため、大きな |
| ブール値 | シャードキーが一意であるかどうかを示します。 シャードキーに一意なインデックスがある場合にのみ、これは | シャードキーが一意の場合、個別の値の数はドキュメントの数と等しくなります。 |
| ドキュメントの配列 | 上位の最も一般的なシャードキー値の 値 と | シャードキー値の頻度は、その値を含むチャンク内のドキュメントの最小数です。 頻度が大きい場合、チャンクはストレージ、読み取り、書込みのボトルネックになる可能性があります。 最も一般的な各値の頻度が 最も一般的なシャードキー値の数は、 |
| ドキュメント | シャードキー。 | |
| integer | 特定のシャードキーのドキュメントの数。 | 最も一般的な各値の頻度が |
| double | 単調性が既知の場合にのみ設定します。 | 次のいずれかに当てはまる場合、これは
コレクションがチャンクの移行を行った場合、単調性チェックで誤った結果が返されることがあります。 チャンク移行により、ドナー シャードからドキュメントが削除され、受信者シャードに再挿入されます。 クライアントからの挿入順序が保持される保証はありません。 |
| 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> } }
To return read and write distribution metrics for a collection using analyzeShardKey, you must configure the query analyzer to sample the queries run on the collection. Otherwise, analyzeShardKey returns the read and write distribution metrics as 0 values. To configure the query analyzer, see configureQueryAnalyzer (database command).
readDistribution フィールド
フィールド | タイプ | 説明 | 使用法 |
|---|---|---|---|
| integer | サンプリングされた読み取りクエリの合計数 | |
| integer | サンプリングされた | |
| integer | サンプリングされた | |
| integer | サンプリングされた | |
| integer | サンプリングされた | |
| double | データの分散方法に関係なく、単一のシャードを対象とする読み取りの割合。 | |
| double | 複数のシャードを対象とする読み取りの割合。 | このカテゴリには、読み取りの対象となる値が 1 つのシャードに該当するようにデータが分散されている場合に、単一のシャードのみを対象とする読み取りが含まれます。 クエリが大量のデータを処理する場合、1 つのシャードではなく複数のシャードをターゲットにすることで、クエリが並列に実行され、レイテンシが低下する可能性があります。 |
| double | データの分散方法に関係なく、スキャッター ギャザーである読み取りの割合。 | このメトリクスには、値が高いシャードキーを避けます。 スキャッター ギャザー クエリは、ターゲット データを持たないシャードには影響しませんが、パフォーマンスにはいくらか影響があります。 多数のシャードを持つクラスターでは、スキャッター ギャザー クエリのパフォーマンスは、単一のシャードを対象とするクエリよりも大幅に低くなります。 |
| 整数の配列 |
|
の合計が 範囲数は |
writeDistribution フィールド
フィールド | タイプ | 説明 | 使用法 |
|---|---|---|---|
| integer | サンプリングされた書込み (write) クエリの合計数です。 | |
| integer | サンプリングされた | |
| integer | サンプリングされた | |
| integer | サンプリングされた | |
| double | データの分散方法に関係なく、単一のシャードを対象とする書込みの割合。 | |
| double | 複数のシャードを対象とする書込みの割合。 | このカテゴリには、書込みの対象となる値が単一のシャードに該当するようにデータが分散されている場合に、単一のシャードのみを対象とする書込みが含まれます。 |
| double | データの分散方法に関係なく、スキャッター ギャザーである書込みの割合。 | 単一のシャードを対象とする書き込みの方がパフォーマンスが向上するため、このメトリクスの値が高いシャードキーは避けてください。 |
| 整数の配列 |
| 書き込み用の ホット シャード が 1 つ以上ある可能性が高いことを意味するため、 の合計が 範囲数は |
| double | ドキュメントのシャードキー値を更新する書込みクエリの割合。 |
更新は現在、再試行可能な書込みとしてまたはトランザクション内でのみサポートされており、バッチ サイズの制限は |
| double |
| このメトリクスでは、値が高いシャードキーを避けます。 このタイプの書込み (write) を実行すると、内部トランザクションの実行が含まれる可能性があるため、コストがかかります。 |
| double |
| このメトリクスでは、値が高いシャードキーを避けます。 |
例
ソーシャル メディア アプリの簡素化されたバージョンを検討してください。 シャーディングしようとしているコレクションは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: } }, ... , { userId: , date: } ] }findAndModifyフィルター{ userId: , firstName: , lastName: , date: }を使用して コマンドを実行し、本体と日付フィールドを更新します。updateコマンドとmulti: falseおよびフィルター{ userId: , firstName: , lastName: , date: { $gte: , $lt: } }を使用して、本体と日付フィールドを更新します。deleteコマンドとmulti: trueおよびフィルター{ userId: , firstName: , lastName: , date: { $lt: } }
以下は、7 日間のワークロードから収集されたサンプリングされたクエリを使用して、いくつかの候補シャードキーに対して analyzeShardKey コマンドによって返されるメトリクスの例です。
注意
Before you run analyzeShardKey commands, read the Supporting Indexes section earlier on this page. If you require supporting indexes for the shard key you are analyzing, use the db.collection.createIndex() method to create the indexes.
{ _id: 1 } キーの特徴
この例では、 analyzeShardKey コマンドを使用して、social.postコレクションの { _id: 1 }シャードキーに関するメトリクスを提供します。
次のコード ブロックでは、 を使用してクエリdb.collection.configureQueryAnalyzer() サンプリングを有効にします。
use social db.post.configureQueryAnalyzer( { mode: "full", samplesPerSecond: 5 } )
db.collection.configureQueryAnalyzer() がクエリ サンプルを収集した後、次のコード ブロックでは analyzeShardKey コマンドを使用して 10、000 ドキュメントをサンプル、結果を計算します。
use social db.post.analyzeShardKey( { _id: 1 }, { keyCharacteristics: true, readWriteDistribution: false, sampleSize: 10000 } )
{ lastName: 1 } key characters
この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 } key characters
この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
この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 } }