web-dev-qa-db-ja.com

MongoDB、インデックス付きフィールドでの正規表現によるクエリのパフォーマンス

名前でアカウントを検索したい(5万アカウントのMongoDBコレクションで)

通常の方法で:文字列で見つける

db.accounts.find({ name: 'Jon Skeet' })  // indexes help improve performance!

正規表現ではどうですか?費用のかかる操作ですか?

db.accounts.find( { name: /Jon Skeet/ }) // worry! how indexes work with regex?

編集:

WiredPrairieによると:
MongoDBは、RegExのprefixを使用してインデックスを検索します(例:/^prefix.*/):

db.accounts.find( { name: /^Jon Skeet/ })  // indexes will help!'

MongoDB $ regex

30
damphat

実際にドキュメントによると、

フィールドにインデックスが存在する場合、MongoDBはインデックス内の値に対して正規表現を照合します。これはコレクションスキャンよりも高速です。正規表現が「プレフィックス式」である場合、さらなる最適化が発生する可能性があります。これは、すべての潜在的な一致が同じ文字列で始まることを意味します。これにより、MongoDBはそのプレフィックスから「範囲」を構築し、その範囲内にあるインデックスの値に対してのみ一致することができます。

http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use

言い換えると:

/ Jon Skeet/regexの場合、mongoはインデックス内のキーを完全にスキャンし、一致したドキュメントをフェッチします。これはコレクションスキャンよりも高速です。

/ ^ Jon Skeet/regexの場合、mongoはインデックス内の正規表現で始まる範囲のみをスキャンします。これにより高速になります。

29
m_elsayed