Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

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
ブール値
任意

シャードキーの特性に関するメトリクスを計算するかどうか。 詳細については、「 キーの特性 」を参照してください

デフォルトは true です。

readWriteDistribution
ブール値
任意

読み取りと書込みの分布に関するメトリクスを計算するかどうか。 詳しくは、「 readWriteDistribution 」を参照してください。

デフォルトは true です。

analyzeShardKeyを使用してコレクションの読み取りと書込みの分散メトリクスを返すには、コレクションで実行されるクエリをサンプリングするようにクエリ アナライザを構成する必要があります。 それ以外の場合、 analyzeShardKeyは読み取りと書込みの分散メトリクスを0値として返します。 クエリアナライザを構成するには、「 configureQueryAnalyzer 」を参照してください。

sampleRate
double
任意

シャードキーの特性に関するメトリクスを計算するときにサンプリングするコレクション内のドキュメントの割合。 sampleRateを設定した場合、 sampleSizeは設定できません。

01より大きく、 以下である必要があります。

デフォルト値はありません。

sampleSize
integer
任意

シャードキーの特性に関するメトリクスを計算するときにサンプリングするドキュメントの数。 sampleSizeを設定した場合、 sampleRateは設定できません。

指定されておらず、かつsampleRateが指定されていない場合、サンプル サイズはデフォルトでanalyzeShardKeyCharacteristicsDefaultSampleSizeで設定されたサンプル サイズになります。

analyzeShardKey は、メソッドの実行時に指定するkeyCharacteristicreadWriteDistributionの値に応じて異なるメトリクスを返します。

keyCharacteristic は、シャードキーの濃度頻度単調性に関するメトリクスで構成されています。 これらのメトリクスは、 keyCharacteristicsが true の場合にのみ返されます。

メトリクスは、コレクションからサンプリングされたドキュメントに基づいてanalyzeShardKeyが実行されるときに計算されます。 計算では、シャードキーにサポートされているインデックスが必要です。 サポートするインデックスがない場合、メトリクスは返されません。

sampleRatesampleSizeフィールドと フィールドを使用してサンプリングを構成できます。どちらも任意であり、指定できるのは 1 つだけです。 どちらも指定されていない場合、サンプル サイズは10に設定されます。 この値はanalyzeShardKeyCharacteristicsDefaultSampleSizeを設定して構成します。

コレクション内のすべてのドキュメントに基づいてメトリクスを計算するには、 sampleRate1に設定します。

readWriteDistribution には、クエリルーティングパターンとシャードキー範囲のホットネス(アクセス頻度)に関するメトリクスが含まれています。 これらのメトリクスは、サンプリングされたクエリに基づいています。

コレクションのクエリ サンプリングを構成するには、 configureQueryAnalyzerコマンドを使用します。 読み取り分散メトリクスと書込み分散メトリクスは、 readWriteDistributiontrueの場合にのみ返されます。 メトリクスはanalyzeShardKeyが実行され、サンプリングされた読み取りおよび書込みクエリが使用されるときに計算されます。 サンプリングされたクエリがない場合、読み取りおよび書込みの分布メトリクスは返されません。

  • サンプリングされた読み取りクエリがない場合、コマンドはwriteDistributionを返しますが、 readDistributionは省略します。

  • サンプリングされた書込み (write) クエリがない場合、コマンドはreadDistributionを返しますが、 writeDistributionは省略します。

analyzeShardKeyを使用してコレクションの読み取りと書込みの分散メトリクスを返すには、コレクションで実行されるクエリをサンプリングするようにクエリ アナライザを構成する必要があります。 それ以外の場合、 analyzeShardKeyは読み取りと書込みの分散メトリクスを0値として返します。 クエリアナライザを構成するには、「 configureQueryAnalyzer 」を参照してください。

keyCharacteristics
readWriteDistribution
返された結果
true
false
false
true
analyzeShardKeyreadWriteDistributionメトリクスを返し、 メトリクスを省略します。keyCharacteristics
true
true
  • analyzeShardKey は、 readWriteDistributionメトリクスとkeyCharacteristicsメトリクスの両方を返します。

  • シャードキーにサポートされているインデックスがない場合、 analyzeShardKeyreadWriteDistributionメトリクスを返し、 keyCharacteristicsメトリクスを省略します。

analyzeShardKey は、コレクションへの読み取りまたは書込みをブロックしません。

読み取りおよび書込みの分布に関するメトリクスの品質は、クエリのサンプリングが行われるときにワークロードがどの程度表現されているかによって決まります。 一部のアプリケーションでは、表現的なメトリクスを返すには、クエリのサンプリングを数日間オンのままにする必要がある場合があります。

analyzeShardKeyに必要なサポート インデックスは、 shardCollectionコマンドに必要なサポート インデックスと異なります。

次の表は、 analyzeShardKeyshardCollectionの両方で同じシャードキーでサポートされているインデックスを示しています。

コマンド
シャードキー
サポートインデックス

analyzeShardKey

{ a.x: 1, b: "hashed" }
  • { a.x: 1, b: 1, ... }

  • { a.x: "hashed", b: 1, ... }

  • { a.x: 1, b: "hashed", ... }

  • { a.x: "hashed", b: "hashed", ...}

shardCollection
{ a.x: 1, b: "hashed" }
{ a.x: 1, b: "hashed", ... }

これにより、シャーディングに必要なサポートインデックスがまだないシャードキーを分析できます。

analyzeShardKeyshardCollectionにはどちらも次のインデックス要件があります。

  • インデックスには単純な照合があります

  • インデックスは複数キーではありません

  • インデックスはスパースではない

  • インデックスは部分的ではない

サポート インデックスを作成するには、 db.collection.createIndex()メソッドを使用します。

パフォーマンスを最小限に抑えるには、 secondaryまたはsecondaryPreferredの読み込み設定(read preference)でanalyzeShardKeyを実行します。 シャーディングされたクラスターでは、指定されていない場合、 mongosは自動的にsecondaryPreferredに設定します。

  • Atlas共有クラスターサーバーレス インスタンスではanalyzeShardKeyを実行できません。

  • スタンドアロン配置ではanalyzeShardKeyを実行できません。

  • --shardsvrレプリカセットに対してanalyzeShardKeyを直接実行することはできません。 シャーディングされたクラスターで実行する場合、 analyzeShardKeymongosに対して実行する必要があります。

  • 時系列コレクションに対してanalyzeShardKeyを実行することはできません。

  • Queryable Encryptionが設定されているコレクションに対してanalyzeShardKeyを実行することはできません。

analyzeShardKey には、次のいずれかのロールが必要です。

analyzeShardKey は、 key charactersreadWriteDistributionに関する情報を返します。

  • keyCharacteristics は、シャードキーの 濃度、頻度、単調性に関するメトリクスを提供します。

  • readWriteDistribution は、クエリ ルーティング パターンとシャードキー範囲の ホットネス(アクセス頻度) に関するメトリクスを提供します。

これは、 keyCharacteristicstrueに設定されている場合に返される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
孤立したドキュメント の数。
孤立したドキュメントは、パフォーマンス上の理由でメトリクスの計算から除外されません。 numOrphanDocsnumDocsTotalに比べて大きい場合は、孤立したドキュメントの数がコレクション内のドキュメントの総数に比べて非常に少なくなるまで待ってからコマンドを実行することを検討してください。
avgDocSizeBytes
integer
コレクション内のドキュメントの平均サイズ(バイト単位)。
numDocsTotal numDocsSampledfrequencyと同等の場合、各mostCommonValues の にavgDocSizeBytes を掛けて、最大チャンクのサイズを推定できます。
numDocsSampled
integer
サンプリングされたドキュメントの数。
numDistinctValues
integer
個別のシャードキー値の数。
個別のシャードキー値の数はバランサーが作成できるチャンクの最大数であるため、大きなnumDistinctValuesを持つシャードキーを選択します。
isUnique
ブール値
シャードキーが一意であるかどうかを示します。 シャードキーに一意なインデックスがある場合にのみ、これはtrueに設定されます。
シャードキーが一意の場合、個別の値の数はドキュメントの数と等しくなります。
mostCommonValues
ドキュメントの配列
上位の最も一般的なシャードキー値の 値 とfrequency (ドキュメント数)の配列。

シャードキー値の頻度は、その値を含むチャンク内のドキュメントの最小数です。 頻度が大きい場合、チャンクはストレージ、読み取り、書込みのボトルネックになる可能性があります。 最も一般的な各値の頻度がnumDocsSampledに比べて低いシャードキーを選択します。

最も一般的なシャードキー値の数は、 analyzeShardKeyNumMostCommonValuesを設定することで構成できます。デフォルトは5になります。 応答の 16 MB の BSON サイズ制限を超えないように、サイズが 15 MB / analyzeShardKey NumMostCommonValues を超える場合は、各値を「切り捨て」に設定します。

mostCommonValues[n].value
ドキュメント
シャードキー。
mostCommonValues[n].frequency
integer
特定のシャードキーのドキュメントの数。
最も一般的な各値の頻度がnumDocsSampledに比べて低いシャードキーを選択します。
monotonicity. recordIdCorrelationCoefficient
double
単調性が既知の場合にのみ設定します。

次のいずれかに当てはまる場合、これは"unknown"に設定されます。

  • シャードキーには、 shardCollection定義ごとにサポートされているインデックスがありません。

  • コレクションはクラスター化されます。

  • シャードキーは、ハッシュされたフィールドが最初のフィールドではないハッシュされた複合シャードキーです。

コレクションがチャンクの移行を行った場合、単調性チェックで誤った結果が返されることがあります。 チャンク移行により、ドナー シャードからドキュメントが削除され、受信者シャードに再挿入されます。 クライアントからの挿入順序が保持される保証はありません。

analyzeShardKeyMongoDB Atlas を使用して、相関係数のしきい値を構成できます。

monotoncity.type
string

次のいずれかになります。

"monotonic", "not monotonic", "unknown"

新しいドキュメントを頻繁に挿入することが予想されない限り、 "monotonic"タイプのシャードキーを使用しないでください。

単調に増加または減少するシャードキーでコレクションがシャーディングされている場合、新しいドキュメントはMaxKeyまたはMinKeyチャンクを所有するシャードに挿入されます。 そのシャードは挿入のボトルネックになる可能性があり、バランサーは挿入された挿入と競合する必要があるため、ほとんどの場合、データのバランスが失われる可能性があります。

以下は、 readWriteDistributiontrueに設定されている場合に返されるドキュメントの構造です。

{
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 」を参照してください。

フィールド
タイプ
説明
使用法
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までソートされた各範囲が対象となる回数を表す数値の配列。

numReadsByRange

の合計がnumReadsByRange sampleSize.totalと似ているシャードキーを選択します。

範囲数はanalyzeShardKeyNumRangesパラメーターを使用して構成できます。デフォルトは100です。 この値は100です。目的は 100 シャードまでスケールアップするシャードキーを見つけることです。

フィールド
タイプ
説明
使用法
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 つ以上ある可能性が高いことを意味するため、 numWritesByRangeの分布が非常にスケーリングしているシャードキーは避けてください。

の合計がnumWritesByRange sampleSize.totalと似ているシャードキーを選択します。

範囲数はanalyzeShardKeyNumRangesパラメーターを使用して構成できます。デフォルトは100です。 この値は100です。目的は 100 シャードまでスケールアップするシャードキーを見つけることです。

percentageOfShardKeyUpdates
double
ドキュメントのシャードキー値を更新する書込みクエリの割合。

percentageOfShardKeyUpdatesの高いシャードキーは避けてください。 ドキュメントのシャードキー値を更新すると、ドキュメントが別のシャードに移動される可能性があります。この場合は、クエリの対象となるシャードで 内部トランザクション を実行する必要があります。 ドキュメントのシャードキー値の変更の詳細については、「 シャードキーの変更 」を参照してください

更新は現在、再試行可能な書込みとしてまたはトランザクション内でのみサポートされており、バッチ サイズの制限は1です。

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()メソッドを使用してインデックスを作成します。

この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"
},
}
}

この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"
},
}
}

この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
}
}

戻る

addShardToZone