MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBで正規表現使用時のパフォーマンス問題を回避する方法

MongoDBで正規表現(regex)を使った検索を実行する際、適切な対策を講じないとパフォーマンスが大幅に低下する恐れがあります。これを回避するためには、インデックスの概念を活用することが有効です。本記事では、実際にコレクションとドキュメントを作成しながら、その手順を具体的に解説します。

インデックスの作成とドキュメントの挿入

まず、createIndex()メソッドを使って「CountryName」と「Name」の2つのフィールドにテキストインデックスを作成します。続いて、insertOne()メソッドでサンプルデータを挿入していきます。意図的に大文字・小文字の異なる「Chris」「chris」「CHRIS」といった名前を登録している点に注目してください。

> db.demo531.createIndex({"CountryName":"text","Name":"text"});{
   "createdCollectionAutomatically" : true,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
}
> db.demo531.insertOne({CountryName:"US","Name":"Chris"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8b2b60ef4dcbee04fbbbf2")
}
> db.demo531.insertOne({CountryName:"UK","Name":"David"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8b2b6cef4dcbee04fbbbf3")
}
> db.demo531.insertOne({CountryName:"AUS","Name":"chris"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8b2b74ef4dcbee04fbbbf4")
}
> db.demo531.insertOne({CountryName:"US","Name":"CHRIS"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8b2badef4dcbee04fbbbf5")
}

登録済みドキュメントの確認

find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。

> db.demo531.find();

上記のコマンドを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e8b2b60ef4dcbee04fbbbf2"), "CountryName" : "US", "Name" : "Chris" }
{ "_id" : ObjectId("5e8b2b6cef4dcbee04fbbbf3"), "CountryName" : "UK", "Name" : "David" }
{ "_id" : ObjectId("5e8b2b74ef4dcbee04fbbbf4"), "CountryName" : "AUS", "Name" : "chris" }
{ "_id" : ObjectId("5e8b2badef4dcbee04fbbbf5"), "CountryName" : "US", "Name" : "CHRIS" }

正規表現を使った検索クエリの実行

次に、$regex演算子を使用した検索クエリを見ていきましょう。$optionsに「i」を指定することで、大文字と小文字を区別しない検索が可能になります。

> db.demo531.find({CountryName: "US", "Name": { "$regex": "chris", "$options": "i" }}).limit(4);

このクエリを実行すると、以下の出力が得られます。「chris」「CHRIS」といった異なる表記のドキュメントもまとめて取得できていることがわかります。

{ "_id" : ObjectId("5e8b2b60ef4dcbee04fbbbf2"), "CountryName" : "US", "Name" : "Chris" }
{ "_id" : ObjectId("5e8b2badef4dcbee04fbbbf5"), "CountryName" : "US", "Name" : "CHRIS" }

まとめ:パフォーマンスを維持するためのポイント

正規表現検索は便利な反面、先頭にアンカー(^)がないパターンではインデックスが利用されず、コレクション全体をスキャンする「コレクションスキャン」が発生しやすくなります。大量のドキュメントを扱う場合は、以下の点に注意しましょう。

  • 前方一致検索を優先する:「^」で始まるアンカー付きの正規表現であれば、通常のインデックスを利用できます。
  • テキストインデックスや大文字小文字を区別しないインデックスを活用する:MongoDB 3.4以降では、照合(collation)を利用してcase-insensitiveなインデックスを作成することも可能です。
  • explain()で実行計画を確認する:クエリが実際にインデックスを使用しているかどうかを必ずチェックしましょう。

このように、インデックスを適切に設計することで、正規表現を使用しながらもMongoDBの高いパフォーマンスを維持することができます。

  1. Windows 10内蔵のトラブルシューティングツールでInternet Explorerのパフォーマンスとセキュリティの問題を解決する方法

    Microsoft Edge(Chromium版)の登場により、長年使われてきたInternet Explorerは役割を終えつつありますが、それでもMicrosoftがIEを残し続けているのには理由があります。企業ユーザーだけでなく、Windows 7から移行したユーザーの中にも、今なおIEをメインブラウザーとして使い続けている人が少なくありません。そんなユーザーのために、Windows 10にはInternet Explorerのパフォーマンスやセキュリティの問題を自動的に診断・修復するトラブルシューティングツールが標準で搭載されています。 Internet Explorerのパフォーマ

  2. Chromeの動作が重いときの対処法|CPU・メモリ使用量を削減してパフォーマンスを改善する方法

    Google Chromeは非常に優れたブラウザですが、その一方でリソースを大量に消費することでも知られています。高性能なPCを使っていても、動作が重く感じられることがあるでしょう。この記事では、Chromeのパフォーマンスを改善するための具体的な方法を解説します。ここで紹介するテクニックは、CPU使用率とメモリ(RAM)使用量の両方を削減できるものばかりです。 なお、本題に入る前に一点だけ注意点を。スペックの低いマシンでは、どれだけ工夫してもChromeが快適に動かないケースがあります。一度も快適に使えた経験がないなら、より軽量なブラウザへの乗り換えも検討してみてください。 パフォーマンスの