MongoDBでクエリの実行時間を改善するには?インデックスを活用した高速化の方法
MongoDBでクエリの実行時間を改善したい場合、最も効果的な手段のひとつがインデックスの作成です。特に、unique: true オプションを付けたユニークインデックスを組み合わせれば、データの一意性を保証しながら検索を高速化できます。
インデックスがない場合、MongoDBは条件に一致するドキュメントを探すためにコレクション全体をスキャンします(コレクションスキャン)。しかし、検索対象のフィールドにインデックスが張られていれば、インデックスを利用して目的のドキュメントへ直接アクセスできるため、大規模なデータセットでも高速にクエリを実行できます。
ここからは、実際にコレクションを作成しながら手順を確認していきましょう。
1. ユニークインデックスの作成
まず、createIndex() メソッドを使って「LastName」フィールドにユニークインデックスを作成します。
> db.demo193.createIndex({"LastName":1},{unique:true});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}この例では、コレクションが存在しなかったため自動的に作成され(createdCollectionAutomatically: true)、インデックス数が1から2に増えています。なお、unique: true を指定しているため、同じ「LastName」の値を持つドキュメントを後から挿入することはできません。
2. ドキュメントの挿入
次に、insertOne() メソッドを使ってテスト用のドキュメントを3件挿入します。
> db.demo193.insertOne({"FirstName":"John","LastName":"Doe"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3ade1803d395bdc21346d1") }
> db.demo193.insertOne({"FirstName":"John","LastName":"Smith"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3ade1f03d395bdc21346d2") }
> db.demo193.insertOne({"FirstName":"David","LastName":"Miller"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3ade2803d395bdc21346d3") }3. 登録された全ドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo193.find();
実行結果は以下の通りです。
{ "_id" : ObjectId("5e3ade1803d395bdc21346d1"), "FirstName" : "John", "LastName" : "Doe" }
{ "_id" : ObjectId("5e3ade1f03d395bdc21346d2"), "FirstName" : "John", "LastName" : "Smith" }
{ "_id" : ObjectId("5e3ade2803d395bdc21346d3"), "FirstName" : "David", "LastName" : "Miller" }4. インデックスを活用した高速な検索
準備が整ったので、「LastName」が「Smith」と一致するドキュメントを検索してみましょう。
> db.demo193.find({"LastName":"Smith"});実行結果は以下の通りです。
{ "_id" : ObjectId("5e3ade1f03d395bdc21346d2"), "FirstName" : "John", "LastName" : "Smith" }このクエリは事前に作成したインデックスを利用するため、コレクション全体をスキャンする場合に比べてはるかに短い時間で実行されます。データ量が増えるほど、その差は顕著になります。
補足:インデックスが使われているか確認するには
クエリが本当にインデックスを利用しているかどうかは、explain() メソッドで確認できます。
> db.demo193.find({"LastName":"Smith"}).explain("executionStats");実行計画の中に IXSCAN(インデックススキャン)が含まれていればインデックスが使われており、COLLSCAN(コレクションスキャン)のみの場合はインデックスが利用されていません。パフォーマンスのチューニングを行う際は、必ずこの実行計画をチェックする習慣をつけるとよいでしょう。
まとめ
- クエリの実行時間を改善するには、検索対象フィールドに
createIndex()でインデックスを作成するのが基本です。 unique: trueを組み合わせれば、データの一意性保証と検索の高速化を同時に実現できます。explain("executionStats")を使えば、インデックスが実際に使用されているかを検証できます。
-
【MongoDB】limit()メソッドでクエリ結果の件数を制限する方法
MongoDBで取得するドキュメントの件数を制限したい場合には、limit()メソッドを使用します。この記事では、実際にコレクションを作成しながら、limit()の基本的な使い方を具体例とともに解説します。 1. コレクションの作成とドキュメントの挿入 まず、insertOne()メソッドを使って、サンプル用コレクション「demo58」に4件のドキュメントを挿入してみましょう。 > db.demo58.insertOne({"Name":"David"}); { "acknowledged" : true, &quo
-
MongoDBでSQLのLIKE検索と同じことを実現する方法
MongoDBにおけるLIKE検索の基本SQLの「LIKE」句のように部分一致でデータを検索したい場合、MongoDBでは find() メソッドと正規表現(//)を組み合わせることで同様の処理を実現できます。この記事では、実際にコレクションを作成し、正規表現を使ったLIKE検索の具体的な手順を解説します。テスト用コレクションの作成まず、サンプルとなるドキュメントを含むコレクションを作成しましょう。ここでは「FirstName」というフィールドを持つドキュメントをいくつか登録します。> db.demo686.insertOne({FirstName:Robert});{ &nb