0

以下に基づいていくつかの値を出力している pymongo を使用したクエリがあります。

cursor = db.collect.find({"index_field":{"$regex":'\s'}}
for document in cursor:
  print document["_id"]

予想どおり、このクエリは長時間 (5 億以上のドキュメント) 実行されています。おそらく、最後に印刷された「_id」がインデックス付きフィールドのどこにあるかを調べることで、クエリが実行されている場所を確認する方法があるかどうか疑問に思っていました。最後に印刷された _id は btree インデックスの途中ですか? 終わりに近いですか?

これを知りたいのは、クエリをキャンセルして再最適化するか、終了させる必要があるかどうかを確認するためだけですが、_id がクエリのどこに存在するかを知る方法がありません。

また、誰かが私の空白クエリを最適化する方法を持っている場合、それは役に立ちます。ドキュメントに基づいて、空白のチェックには意味がありませんが、ignorecaseを使用した方が高速になるようです。

どうもありがとう、J

4

1 に答える 1

1

クエリの最適化

ドキュメント内のスペースを探す非効率的な検索であるため、クエリを最適化できません。あなたができることは、例えばの接頭辞を検索することです$regex\s$regex\s

db.collect.find({"index_field": {"$regex": '^\\s'}})

リンク先の注意事項をご確認ください

索引付けの問題

$regex は、正規表現が文字列の先頭 (つまり ^) のアンカーを持ち、大文字と小文字を区別する一致である場合にのみ、インデックスを効率的に使用できます。さらに、/^a//^a.*/、および /^a.*$/は同等の文字列に一致しますが、パフォーマンス特性が異なります。適切なインデックスが存在する場合、これらの式はすべてインデックスを使用します。ただし、/^a.*/、および/^a.*$/は低速で​​す。 /^a/プレフィックスの一致後にスキャンを停止できます。


DB op の情報

db.currentOp()実行中のすべてのopsに関する情報を取得するために使用します。

于 2013-10-07T15:51:25.893 に答える