Mongodb:大数据结构

时间:2015-11-30 20:05:16

标签: node.js mongodb data-structures mongoose database

我正在重建我的网站,这是一个来自法国最活跃论坛的昵称的搜索引擎:你搜索一个昵称,你就得到了它的所有信息。

我当前的数据库包含超过60Gb的数据,存储在MySQL数据库中。我现在将其重写为mongodb数据库,在检索到100万条消息(1条消息= 1条文档)之后,find()开始需要一段时间。

文件的结构如下:

{
  "_id" : ObjectId(),
  "message": "<p>Hai guys</p>",
  "pseudo" : "mahnickname", //from a nickname (*pseudo* in my db)
  "ancre" : "774497928", //its id in the forum
  "datepost" : "30/11/2015 20:57:44"
}

我将id ancre 设置为唯一,因此我不会获得两次相同的条目。

然后,用户输入昵称,然后查找具有该昵称的所有文档。

以下是请求:

Model.find({pseudo: "danickname"}).sort('-datepost').skip((r_page -1) * 20).limit(20).exec(function(err, bears)...

我应该以不同的方式构建它吗?我没有为每条消息提供一个文档,而是为每个昵称提供了一个文档,一旦我从该昵称中获得新消息,我就会更新该文档?

我正在使用MySQL的第一种方法,但它并没有花那么长的时间。

编辑:或者我可能只是将昵称编入索引()?

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是有关大数据问题的一些建议:

  1. The ObjectId already contains a timestampYou can also sort on it。您可以通过删除datepost字段来节省一些磁盘空间。
  2. 你绝对需要ancre字段吗? ObjectId已经是唯一的并且已编入索引。如果您完全需要它并且也需要保持datepost分隔,则可以将_id字段替换为您的ancre字段。
  3. 正如许多人所提到的,你应该在pseudo上添加一个索引。这将使&#34;获取伪是mahnickname&#34;的所有消息。搜索得更快。
  4. 如果每个用户的邮件数量很少,您可以将所有邮件存储在每个用户的单个文档中。这将避免必须跳到特定页面,这可能很慢。但是,请注意16mb limit。我个人仍会将它们放在多个文档中。
  5. 要保持快速查询速度,请确保所有indexed fields fit in RAM。您可以通过键入db.collection.stats()并查看indexSizes子文档来查看索引字段的RAM消耗。
  6. 您是否有办法不跳过文档,但是将它写入数据库的时间用作您的页面?如果是,请使用datepost字段或_id中的时间戳作为您的分页策略。如果您决定使用datepost,请在pseudodatepost上建立compound index
  7. 对于您的基准测试,您可以使用mongotopmongostat密切监控MongoDB。