为集合添加新项目后,为什么我的MongoDB查询速度慢?

时间:2013-07-20 18:01:00

标签: mongodb database-performance mongodb-indexes

对此的任何帮助都将受到广泛赞赏。

我有一个庞大的Mongodb集合,我将用户活动存储在其中。它为我想要运行的查询提供了几个复合索引,通常查询性能非常好,用户活动流会立即加载。

然而,最近我添加了一个后台任务,每2小时为该集合添加20k记录(每个用户一个新记录)。由于此任务已添加 - 我注意到在添加这些记录后第一次访问我的活动流时,在页面加载之前会有很长的延迟。然后,当我刷新页面时,它会快速加载。

在我尝试访问它们之后,新项目似乎只被添加到索引中。但是从我在MongoDB常见问题解答中看到的内容 - 它们会自动添加到索引中 - 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
)

1 个答案:

答案 0 :(得分:1)

我认为最可能的答案是后台任务导致文档在添加新文档时内存不足。第二个请求很快,因为您只是将文档拉入内存。如果没有关于您正在执行的文档和查询的详细信息的更多详细信息,很难确定。

如果您在第一次加载页面时运行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

也可以删除其中一个索引,因为它们仅在最后一个字段的方向上不同。唯一不合适的情况是,如果您的应用程序使用{type:1,user_id:1}和{type:1,user_id:-1}作为排序文档对查询结果进行排序。

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

根据您正在执行的实际查询,还有其他可能可删除的索引。

HTH - Rob。