4

MongoDB と対話する PHP アプリがあります。最近までアプリは正常に動作していましたが、数日前にアプリの応答が非常に遅くなり始めていることがわかりました。コレクションの 1 つで、最大 50 万件以上のレコードが撮影されました。そのため、そのコレクションに対するクエリの MongCursor はタイムアウトし続けます。

500K レコードが多すぎるとは思いません。mongodb を使用する他のページも同様に速度が低下し始めていますが、500k レコードのコレクションを使用するページほどではありません。MongoDB と対話しない静的ページは、依然として高速に応答します。

ここで何が問題になるのかわかりません。コレクションにインデックスを付けたので、問題はないようです。もう 1 つの注意点は、サーバーの RAM 仕様が 512 MB であり、PHP が Mongo を実行すると、top コマンドで 15000k の空きメモリが表示されることです。

どんな助けでも大歓迎です。

4

2 に答える 2

7

チャット ルームからのフォローアップを要約すると、この問題は実際には find() クエリに関連しており、約 50 万件のドキュメントすべてをスキャンして 15 件を検索しています。

db.tweet_data.find({ 
    $or: 
    [ 
        { in_reply_to_screen_name: /^kunalnayyar$/i, handle: /^kaleycuoco$/i, id: { $gt: 0 } }, 
        { in_reply_to_screen_name: /^kaleycuoco$/i, handle: /^kunalnayyar$/i, id: { $gt: 0 } } 
    ], 
    in_reply_to_status_id_str: { $ne: null }
} ).explain() 
{ 
    "cursor" : "BtreeCursor id_1", 
    "nscanned" : 523248, 
    "nscannedObjects" : 523248, 
    "n" : 15, 
    "millis" : 23682, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
        "id" : [ 
            [ 
                0, 
                1.7976931348623157e+308 
            ] 
        ] 
    } 
}

このクエリは、大文字と小文字を区別しない正規表現を使用しているため、インデックスを効率的に使用できません (この場合、実際には定義されていませんでしたが)。

推奨されるアプローチ:

  • 検索用に小文字handle_lcとフィールドを作成するinreply_lc

  • それらに複合インデックスを追加します。

    db.tweet.ensureIndex({handle_lc:1, inreply_lc:1})

  • 複合インデックスの順序により、すべてのツイートhandleを ( ) または ( handle,in_reply_to)で効率的に検索できます。

  • 正規表現の代わりに完全一致で検索:

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 } } ], })

于 2012-07-28T15:09:26.787 に答える
0

はい、500K+ は問題ないはずです..私の知る限り、コレクション内のドキュメントの数に実際の「制限」はありません..おそらく、それは MongoDB が生成できる _id フィールドの一意の組み合わせの数です..しかし、それは多くのことです500Kより大きい..あなたの場合、私が疑うのは、おそらくあなたのクエリはあまり選択的ではありません. そのため、コレクション内のドキュメントが少ないときは、問題に気付きませんでした。しかし、増加すると、突然遅くなったように見えます..のように、MongoCursor はいくつのドキュメントを返しますか?

于 2012-07-28T12:58:43.553 に答える