优化MongoDB

时间:2011-06-27 15:13:27

标签: mongodb

我有大约105个与此​​类似的记录:

{
  "post_id": 1314131221,
  "date": 1309187001,
  "upvotes": 2342
}

在MongoDB集合中。 我还有一个关于“post_id”和“date”的索引。

然后我需要这样做:

db.fb_pages_fans.find({
    post_id: 1314131221,
    date: {"$gt": 1309117001, "$lta": 1309187001}
}).sort({date: 1});

如果我在特定日期设置“日期”:

  • 当它返回30条记录时,耗时约130毫秒
  • 当它返回90条记录时,需要约700毫秒
  • 当它返回180条记录时,需要~1200毫秒

当然我说的是第一个查询,第二个和更多查询非常快,但我需要快速查询。

它比我现在使用的PostgreSQL的90条记录要慢得多。为什么这么慢?

顺便说一句。在105mil记录上创建两个“cols”的索引需要 24小时

它在一台具有12GB RAM的计算机上运行,​​这是我在执行查询时来自mongostats的日志:

insert  query update delete getmore command flushes mapped  vsize    res faults locked % idx miss %     qr|qw   ar|aw  netIn netOut  conn       time
     0      0      0      0       0       1       0  23.9g  24.1g     8m      0        0          0       0|0     0|0    62b     1k     1   18:34:04
     0      1      0      0       0       1       0  23.9g  24.1g     8m     21        0          0       0|0     0|0   215b     3k     1   18:34:05

1 个答案:

答案 0 :(得分:1)

如果您的第一个查询速度很慢且所有后果都很快,那么类似的查询会很快,然后mongo会将查询到的数据从磁盘移动到内存。对于数据集来说,这是相对难以避免的。使用mongostat并检查故障统计信息,以查看在查询期间是否收到了页面故障。或者,您的索引可能不适合内存,在这种情况下,您可以尝试并平衡它们,以便它的相关高吞吐量部分始终在物理内存中。

另外,我们是在讨论单个物理数据库还是分片设置?