MongoDB性能:新闻源架构,订阅者,评论

时间:2012-01-28 09:32:08

标签: php performance mongodb feed news-feed

我使用MongoDB + PHP作为“facebookish”新闻源,提供不同类型的提要(帖子,照片,投票等)和评论。

每个Feed都属于某个“频道” - 目前可能是用户(将来可能会有更多容器)。

任何用户都可以订阅任何频道或取消订阅。

现在让我们说有大量的渠道和大量的饲料。频道/提要/评论的最佳结构是什么?

我正在考虑两种方法:

1)使用每个Feed中的订阅者列表收集Feed:

feeds: 
[
   {date_added: ..., 
    last_update: ..., 
    title: ...,
    text: ...,
    channel: ..., 
    channel_subscribers: [...],
    comments_subscribers: [...],
    comments: [...] 

   },
   {...},
   {...},
   {...}
]

如果我想获得最后的Feed:

db.feeds.find({date_added: "this week", channel_subscribers: "my_login"});

如果我想获得带有新评论的Feed:

db.feeds.find({last_update: "this week", comments_subscribers: "my_login"});

优点:

  • 简单快速的读数?

缺点:

  • 当我想订阅/取消订阅频道时,我必须运行 通过所有提要并从列表中推/拉我的名字 channel_subscribers;如果我有大量的饲料,它可能会很慢

2)单独的“频道”集合: 同样的事情,但保留频道集合中的订阅者列表:

channels: 
[
  {channel_id:..., last_update: ..., subscribers: [...]},
  {channel_id:..., last_update: ..., subscribers: [...]}
]

首先,我必须查询最近更新的频道:

subscribes = db.channels.find({last_update: "today", subscribers: "my_login"})

现在找到我的Feed:

db.feeds.find({channel: {$in: subscribes}], date_added: "today"})

优点:

  • 简单,快速,更安全的订阅/取消订阅;

缺点:

  • 我觉得我应该避免 $ in ,因为它很慢(?),特别是当我有很多 订阅将此操作符放入其中。

3)保持用户订阅用户集合(因此每个用户都有自己订阅的数组)

users:
[
  {_id: ..., login: ..., email: ..., subscribes: [...]}
]

缺点: - 在这种情况下,我们将有更大的数组放入$ in而不是之前的(#2)方法。

4)您的建议?

1 个答案:

答案 0 :(得分:1)

好的,我会自己回答。我试着在我的笔记本电脑Windows 7 32位/ 2GB RAM上进行测试。 我创建了一个“feed”集合,并用500个feed填充它:

feeds:
[
 {_id: ..., subscribers: [...]},
 {_id: ..., subscribers: [...]},
]

每个“subscriber”数组都有一个包含2000个短随机字符串名称的列表。

首先,我必须提到我的数据库大小从60Mb增加到1.5Gb。

然后当我运行shell命令db.feeds.ensureIndex({subscribers: 1})时,它挂了大约3分钟然后因错误而停止:"can't map file memory - mongo requires 64 bit build for larger datasets"

因此,在mongo的文档中创建如此大的多键字段绝对不是一个好主意。