【发布时间】:2016-03-04 14:01:53
【问题描述】:
我正在重建我的网站,该网站是法国最活跃论坛的昵称搜索引擎:您搜索昵称并获得所有消息。
我当前的数据库包含超过 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 中使用了第一种方法,但并没有花那么长时间。
编辑:或者我应该只索引昵称(pseudo)?
谢谢!
【问题讨论】:
-
你应该给
pseudo添加一个索引。在这里查看这篇文章,特别是选择性区域:stackoverflow.com/questions/33545339/… -
注意
skip实际上必须解析它跳过的文档,所以如果r_page真的很大,那么skip将需要跳过一堆文档。 -
啊哈,我完全忘记了为昵称编制索引。谢谢大佬,我现在试试
-
@DavidGrinberg r_page 可能真的很大,是的,这取决于昵称发布的消息。你有什么建议?
-
@Sinequanon 请参阅 Mongo 关于主题 here 的注释。另请查看是否可以添加更多数据进行过滤。加上索引。
标签: node.js mongodb data-structures mongoose database