MongoDBで大規模な動的データセットのタグ集計を高速化する方法:インデックスとexplain()によるパフォーマンス検証
はじめに
MongoDBで大規模な動的データセットを扱う際、タグ(配列フィールド)に対する検索や集計のパフォーマンスを確保するためには、インデックスの作成とexplain()による実行計画の確認が重要です。本記事では、実際のコード例を通じて、インデックスが正しく使用されているかを検証する手順を解説します。
1. コレクションの作成とインデックスの設定
まず、タグ情報を配列として持つドキュメントを格納するコレクションを作成し、「Subjects」フィールドにインデックスを設定します。
> db.demo278.ensureIndex({"Subjects":1});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}インデックスが作成できたら、サンプルドキュメントをいくつか挿入します。
> db.demo278.insertOne({"Subjects":["MySQL","MongoDB","Java"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e49096edd099650a5401a55")
}
> db.demo278.insertOne({"Subjects":["C","C++"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e490978dd099650a5401a56")
}
> db.demo278.insertOne({"Subjects":["Spring","Hibernate"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e490984dd099650a5401a57")
}2. 登録されたドキュメントの確認
find()メソッドを使用して、コレクション内のすべてのドキュメントを表示します。
> db.demo278.find();
実行結果は以下の通りです。
{ "_id" : ObjectId("5e49096edd099650a5401a55"), "Subjects" : [ "MySQL", "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e490978dd099650a5401a56"), "Subjects" : [ "C", "C++" ] }
{ "_id" : ObjectId("5e490984dd099650a5401a57"), "Subjects" : [ "Spring", "Hibernate" ] }3. explain()によるパフォーマンスの検証
次に、$in演算子を使ったクエリの実行計画をexplain()で確認します。これにより、作成したインデックスが実際に使用されているかを判断できます。
> db.demo278.find({Subjects:{$in:["Spring","MongoDB"]}}).explain();実行結果は以下の通りです。
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.demo278",
"indexFilterSet" : false,
"parsedQuery" : {
"Subjects" : {
"$in" : [
"MongoDB",
"Spring"
]
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"Subjects" : 1
},
"indexName" : "Subjects_1",
"isMultiKey" : true,
"multiKeyPaths" : {
"Subjects" : [
"Subjects"
]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"Subjects" : [
"[\"MongoDB\", \"MongoDB\"]",
"[\"Spring\", \"Spring\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "DESKTOP-QN2RB3H",
"port" : 27017,
"version" : "4.0.5",
"gitVersion" : "3739429dd92b92d1b0ab120911a23d50bf03c412"
},
"ok" : 1
}実行結果のポイント
この出力で注目すべき点は以下の通りです。
stage: "IXSCAN" が表示されていることから、クエリがインデックススキャン(IXSCAN)を使用していることがわかります。もしインデックスが使われていなければ、全ドキュメントを走査する「COLLSCAN」となり、大規模データセットでは大幅なパフォーマンス低下につながります。
また、isMultiKey: true となっている点にも注目してください。「Subjects」フィールドは配列であるため、MongoDBは自動的にマルチキーインデックスとして扱います。これにより、配列内の各要素が個別にインデックス化され、$inクエリでも効率的な検索が可能になります。
さらに、indexBoundsには「MongoDB」と「Spring」それぞれの範囲が指定されており、インデックスから該当するタグのみをピンポイントで取得できていることが確認できます。
まとめ
大規模な動的データセットでタグをカウント・検索するシステムを構築する際は、以下の手順が効果的です。
1. 対象フィールドにインデックスを作成する(ensureIndex / createIndex)
2. explain()で実行計画を確認し、IXSCANが使用されていることを検証する
3. 配列フィールドは自動的にマルチキーインデックスとして処理されることを理解する
なお、ensureIndex()は古いメソッドであり、現在のバージョンのMongoDBではcreateIndex()の使用が推奨されています。また、explain(true)やexplain("executionStats")を使うと、実際の実行時間やスキャンしたドキュメント数など、より詳細なパフォーマンス情報を取得できます。
-
MongoDBでカーソルの反復回数をカウントする方法を解説
MongoDBでカーソルの反復をカウントするには?MongoDBにおいて、whileループとfind()メソッドが返すカーソルを組み合わせた独自のロジックを実装することで、カーソルの反復回数(特定の条件に一致するドキュメント数)をカウントできます。本記事では、実際のコード例を通じて、その具体的な手順をわかりやすく解説します。1. ドキュメントを含むコレクションを作成するまず、サンプル用のドキュメントを挿入してコレクションを作成します。> db.demo724.insertOne( ... { ... details: ... { ...
-
Windowsでシステムの復元ポイントを作成する方法【初心者向け手順解説】
システムの復元ポイントは、Windowsのトラブルシューティングにおいて非常に便利な機能です。問題が発生する前の時点までシステムを巻き戻せるため、Windowsを初期化することなく、手軽に不具合を解消できます。さらに、復元ポイントは個人ファイル(写真やドキュメントなど)には影響しないため、安心して利用できるのも大きな魅力です。 通常、Windowsはソフトウェアのインストール時や重要な更新プログラムの適用時に、自動的に復元ポイントを作成します。しかし、自分で任意のタイミングで作成しておくこともおすすめです。特に、システム設定を大きく変更する前や、レジストリを編集する前に復元ポイントを作っておけ