定義
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> } )
コマンドフィールド
フィールド | タイプ | 必要性 | 説明 |
|---|---|---|---|
| ドキュメント | 必須 | 分析するシャードキー。 これは、シャーディングされていないコレクションまたはシャーディングされたコレクションの候補シャードキー、またはシャーディングされたコレクションの現在のシャードキーです。 デフォルト値はありません。 |
| ブール値 | 任意 | シャードキーの特性に関するメトリクスを計算するかどうか。 詳細については、「 キーの特性 」を参照してください。 デフォルトは |
| ブール値 | 任意 | 読み取りと書込みの分布に関するメトリクスを計算するかどうか。 詳しくは、「 readWriteDistribution 」を参照してください。 デフォルトは
|
| double | 任意 | シャードキーの特性に関するメトリクスを計算するときにサンプリングするコレクション内のドキュメントの割合。
デフォルト値はありません。 |
| integer | 任意 | シャードキーの特性に関するメトリクスを計算するときにサンプリングするドキュメントの数。 指定されておらず、かつ |
動作
analyzeShardKey は、メソッドの実行時に指定するkeyCharacteristicとreadWriteDistributionの値に応じて異なるメトリクスを返します。
シャードキーの特性に関するメトリクス
keyCharacteristic は、シャードキーの濃度、頻度、単調性に関するメトリクスで構成されています。 これらのメトリクスは、 keyCharacteristicsが true の場合にのみ返されます。
メトリクスは、コレクションからサンプリングされたドキュメントに基づいてanalyzeShardKeyが実行されるときに計算されます。 計算では、シャードキーにサポートされているインデックスが必要です。 サポートするインデックスがない場合、メトリクスは返されません。
sampleRate フィールドと sampleSize フィールドを使用してサンプリングを構成できます。どちらも任意ですが、指定できるのは 1 つだけです。sampleRate と sampleSize の両方が指定されていない場合、 MongoDB はanalyzeShardKeyCharacteristicsDefaultSampleSize パラメータの値を使用します。このパラメータのデフォルト値は 1000 万です。
コレクション内のすべてのドキュメントに基づいてメトリクスを計算するには、 sampleRateを1に設定します。
読み取りおよび書込みの分散に関するメトリクス
readWriteDistribution には、クエリルーティングパターンとシャードキー範囲のホットネス(アクセス頻度)に関するメトリクスが含まれています。 これらのメトリクスは、サンプリングされたクエリに基づいています。
コレクションのクエリ サンプリングを構成するには、 configureQueryAnalyzerコマンドを使用します。 読み取り分散メトリクスと書込み分散メトリクスは、 readWriteDistributionがtrueの場合にのみ返されます。 メトリクスはanalyzeShardKeyが実行され、サンプリングされた読み取りおよび書込みクエリが使用されるときに計算されます。 サンプリングされたクエリがない場合、読み取りおよび書込みの分布メトリクスは返されません。
サンプリングされた読み取りクエリがない場合、コマンドは
writeDistributionを返しますが、readDistributionは省略します。サンプリングされた書込み (write) クエリがない場合、コマンドは
readDistributionを返しますが、writeDistributionは省略します。
analyzeShardKey を使用してコレクションの読み取りと書込みの分散メトリクスを返すには、コレクションで実行されるクエリをサンプルようにクエリアナライザを構成する必要があります。それ以外の場合、analyzeShardKey は読み取りと書込みの分散メトリクスを 0 値として返します。クエリアナライザを構成するには、configureQueryAnalyzer(データベースコマンド)を参照してください。
keyCharacteristics 値 | readWriteDistribution 値 | 返された結果 |
|---|---|---|
|
|
|
|
|
|
|
|
|
非ブロッキングの動作
analyzeShardKey は、コレクションへの読み取りまたは書込みをブロックしません。
クエリ サンプリング
読み取りおよび書込みの分布に関するメトリクスの品質は、クエリのサンプリングが行われるときにワークロードがどの程度表現されているかによって決まります。 一部のアプリケーションでは、表現的なメトリクスを返すには、クエリのサンプリングを数日間オンのままにする必要がある場合があります。
サポートインデックス
analyzeShardKeyに必要なサポート インデックスは、 shardCollectionコマンドに必要なサポート インデックスと異なります。
次の表は、 analyzeShardKeyとshardCollectionの両方で同じシャードキーでサポートされているインデックスを示しています。
コマンド | シャードキー | サポートインデックス |
|---|---|---|
|
|
|
|
|
|
これにより、シャーディングに必要なサポートインデックスがまだないシャードキーを分析できます。
analyzeShardKeyとshardCollectionにはどちらも次のインデックス要件があります。
サポート インデックスを作成するには、 db.collection.createIndex()メソッドを使用します。
読み込み設定 (read preference)
パフォーマンスを最小限に抑えるには、 secondaryまたはsecondaryPreferredの読み込み設定(read preference)でanalyzeShardKeyを実行します。 シャーディングされたクラスターでは、指定されていない場合、 mongosは自動的にsecondaryPreferredに設定します。
制限
Atlas Flex クラスターでは
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", } } }
フィールド | タイプ | 説明 | 使用法 |
|---|---|---|---|
| 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> } }
analyzeShardKey を使用してコレクションの読み取りと書込みの分散メトリクスを返すには、コレクションで実行されるクエリをサンプルようにクエリアナライザを構成する必要があります。それ以外の場合、analyzeShardKey は読み取りと書込みの分散メトリクスを 0 値として返します。クエリアナライザを構成するには、configureQueryAnalyzer(データベースコマンド)を参照してください。
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: }, ] }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()メソッドを使用してインデックスを作成します。
{ _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 } }