46

名前でアカウントを検索したい (50K アカウントの 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.*/):

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

MongoDB $正規表現

4

2 に答える 2

45

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

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

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

言い換えると:

正規表現の場合/Jon Skeet/、mongo はインデックス内のキーをフル スキャンしてから、一致するドキュメントをフェッチします。これは、コレクション スキャンよりも高速です。

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

于 2015-10-19T16:26:06.953 に答える