1

これに関するヘルプは大歓迎です。

ユーザー アクティビティを格納する大規模な Mongodb コレクションがあります。実行したいクエリ用の複数の複合インデックスがあり、通常、クエリのパフォーマンスは素晴らしく、ユーザー アクティビティ ストリームはすぐに読み込まれます。

ただし、最近、2 時間ごとに 20,000 レコードをコレクションに追加するバックグラウンド タスクを追加しました (ユーザーごとに 1 つの新しいレコード)。このタスクが追加されてから、これらのレコードが追加された後に初めてアクティビティ ストリームにアクセスしたときに、ページが読み込まれるまでに大きな遅延があることに気付きました。次に、ページを更新すると、すぐに読み込まれます。

アクセスしようとした後、新しいアイテムがインデックスに追加されるだけのようです。しかし、MongoDB FAQ で読んだことから、それらは自動的にインデックスに追加されます - http://docs.mongodb.org/manual/faq/indexes/#should-you-run-ensureindex-after-every-insert。おそらく、まだ追加されていないだけの場合ですか?

役立つ場合は、これが私のコレクション統計です。

Array
(
[ns] => main.activities
[count] => 26280825
[size] => 3234981772
[avgObjSize] => 123.09285465734
[storageSize] => 4211892224
[numExtents] => 30
[nindexes] => 20
[lastExtentSize] => 844685312
[paddingFactor] => 1.001
[systemFlags] => 1
[userFlags] => 0
[totalIndexSize] => 25240448464
[indexSizes] => Array
    (
        [_id_] => 946551872
        [portfolio_id_1_type_1_timestamp_-1] => 1519746704
        [project_id_1_type_1_timestamp_1] => 1839902512
        [project_id_1] => 1148997808
        [piece_id_1] => 792794016
        [user_id_1_type_1_timestamp_-1] => 1903806128
        [type_1_timestamp_-1] => 1475522720
        [user_id_1_type_1] => 1440243280
        [project_id_1_type_1] => 1394008000
        [project_id_1_type_1_timestamp_1_project_page_timestamp_1] => 2114419888
        [project_id_1_type_1_project_page_timestamp_1] => 1564649296
        [conversation_id_1] => 870670416
        [project_comment_id_1] => 814640288
        [project_comment_id_1_type_1] => 1032408048
        [reply_to_comment_id_1] => 512324512
        [collection_id_1] => 822996160
        [user_id_1] => 1233578528
        [portfolio_id_1] => 852691392
        [type_1_user_id_1] => 1477182448
        [type_1_user_id_-1] => 1483314448
    )

[ok] => 1
)
4

1 に答える 1

1

最も可能性の高い答えは、バックグラウンド タスクが新しいドキュメントを追加したときにドキュメントがメモリ不足になっているということだと思います。ドキュメントをメモリにプルしただけなので、2 番目の要求は高速です。実行しているドキュメントとクエリの詳細について詳しく説明しないと、確実に判断することは困難です。

最初にページをロードするときに mongostat を実行し、多くの障害が発生した場合は、より多くのメモリが必要です。

いくつかのインデックスを削除することで、メモリを少し取り戻すことができます。具体的には、次のインデックスは別のインデックスの共通のプレフィックスであるため、削除できます。

    [project_id_1] => 1148997808
    [user_id_1_type_1] => 1440243280
    [project_id_1_type_1] => 1394008000
    [project_comment_id_1] => 814640288
    [user_id_1] => 1233578528
    [portfolio_id_1] => 852691392

また、最後のフィールドの方向が異なるだけなので、これらのインデックスの 1 つを削除することもできます。そうでない唯一のケースは、アプリケーションがソート ドキュメントとして {type : 1, user_id : 1} と {type : 1, user_id:-1} の両方を使用してクエリ結果をソートする場合です。

    [type_1_user_id_1] => 1477182448
    [type_1_user_id_-1] => 1483314448

実行している実際のクエリに応じて、削除できるインデックスが他にもあります。

HTH - ロブ。

于 2013-07-20T18:33:17.270 に答える