6

そのため、今日、MongoDB クエリが非常に遅く、タイムアウトするというこの問題が発生しました。この質問を投稿しました - MongoDB too many records? 彼の提案は正しかったので、インデックスを確保し、大文字と小文字を区別しないようにする必要がありました。Mongoシェルで試してみましたが、完璧に機能しました。

しかし、PHP 経由で実行したときは、まだ同じでした :( その後、クエリに「id」(_id ではない) フィールドの並べ替えがあることに気付き、それを削除すると、ものすごい速さでした。しかし、並べ替えを使用すると、本当に遅かった. 私はすでに id フィールドにインデックスを持っていました. これはクエリです:

db.tweet_data.find({ 
...     $or: 
...         [ 
...             { in_reply_to_screen_name: /^kunalnayyar$/, handle: /^kaleycuoco$/, id: { $gt: 0 } }, 
...             { in_reply_to_screen_name: /^kaleycuoco$/, handle: /^kunalnayyar$/, id: { $gt: 0 } } 
...         ], 
...     in_reply_to_status_id_str: { $ne: null } 
...     
...     } ).sort({id:-1})explain()

したがって、私のインデックスは次のとおりです:(複合ではありません){ {id:-1} , {handle:1}, {in_reply_to_screen_name:1} } いくつか読んだ後、それは複合インデックスである必要があることに気付き、2つのバリエーションを試して成功しませんでした:1.2 {handle:1, in_reply_to_screen_name:1, id:-1} .{id:-1,handle:1, in_reply_to_screen_name:1}

どこが間違っているのかわかりませんが、ここで問題がインデックス化されていることは確かです。私はあまりにも忙しくて、インデックスを作成する順序とフィールドを理解できません

4

1 に答える 1

1

explainクエリに対して実行する必要があります。何が起こっているのかを理解するのに役立ちます。

Mongo がフィルター処理と並べ替えの両方にインデックスを使用していない可能性があります。を使用する$orと、複数のインデックスを使用してオプションを一致させることができます。ただし、を追加するsortと、フィルタリングに使用できるインデックスが使用されなくなる場合があります。

クエリで並べ替える場合は、並べ替えたフィールドがヒットするインデックスにあることを確認する必要があります (最後、または並べ替えに使用できません)。

インデックス ヒントを渡すことで高速化できる場合もあります。クエリが一致するドキュメントの数はわかりませんが、数が少なく、初期条件がインデックスにヒットしていることを確認すると、並べ替えを_idすばやく実行できます。

于 2012-07-28T20:59:45.603 に答える