我正在重建我的网站,这是一个来自法国最活跃论坛的昵称的搜索引擎:你搜索一个昵称,你就得到了它的所有信息。
我当前的数据库包含超过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的第一种方法,但它并没有花那么长的时间。
编辑:或者我可能只是将昵称编入索引(伪)?
谢谢!
答案 0 :(得分:1)
以下是有关大数据问题的一些建议:
datepost
字段来节省一些磁盘空间。ancre
字段吗? ObjectId已经是唯一的并且已编入索引。如果您完全需要它并且也需要保持datepost
分隔,则可以将_id
字段替换为您的ancre
字段。pseudo
上添加一个索引。这将使&#34;获取伪是mahnickname&#34;的所有消息。搜索得更快。db.collection.stats()
并查看indexSizes
子文档来查看索引字段的RAM消耗。datepost
字段或_id
中的时间戳作为您的分页策略。如果您决定使用datepost
,请在pseudo
和datepost
上建立compound index。