优化MongoDB

优化MongoDB,mongodb,Mongodb,我有大约1.05亿条类似的记录: { "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.05亿条类似的记录:

{
  "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记录上创建上述两个“col”的索引大约需要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

如果您的第一个查询很慢,并且所有的查询都是连续的,类似的查询很快,那么mongo会将查询的数据从磁盘移动到内存中。对于这样大小的数据集,这是相对难以避免的。使用mongostat并检查faults statistic,查看在查询过程中是否出现页面错误。或者,您的索引可能不适合内存,在这种情况下,您可以尝试对它们进行适当的平衡,使其相关的高吞吐量部分始终位于物理内存中


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

如果您的第一个查询速度慢,而所有的查询都是连续的、类似的查询速度快,那么mongo会将查询的数据从磁盘移动到内存。对于这样大小的数据集,这是相对难以避免的。使用mongostat并检查faults statistic,查看在查询过程中是否出现页面错误。或者,您的索引可能不适合内存,在这种情况下,您可以尝试对它们进行适当的平衡,使其相关的高吞吐量部分始终位于物理内存中

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