减少MongoDB查询大型数据集的延迟

时间:2014-08-11 18:03:59

标签: mongodb optimization mongoose mlab querying

我有以下用于在我的网络应用中查询提示的代码。我试图找出如何优化此代码以更快地运行。目前,100个条目需要大约350毫秒,1000个条目需要大约1000毫秒,而对于10,000个条目,它需要大约6000毫秒才能发送响应。我已经研究过索引,但它似乎并没有让它变得更快。我现在使用MongoLabs在工具,用户名和rating_level上创建索引。我在考虑使用Redis,但不确定如何实现它。

   app.get('/api/ideas', function(req, res, next) {
     var query;
     if (req.query.tool) {
       query = Idea.find({ tool : req.query.tool });
     } 
     else if (req.query.username) {
       query = Idea.find({ username : req.query.username });
     } 
     else {
       query = Idea.find();
     }
     if(req.query.sortRank) {
       query = query.sort({rating_level: req.query.sortRank});
     }
     else if(req.query.sortDate) {
       query = query.sort({datetime: req.query.sortDate});
     }
     else {
       query = query.sort({rating_level: -1});
     }
     query.exec(function(err, ideas) {
       if (err) return next(err);
       res.send(ideas);
     });

1 个答案:

答案 0 :(得分:0)

您在代码中生成了几种不同的查询模式和排序组合:

  • 工具,rating_level
  • 工具,日期时间
  • username,rating_level
  • 用户名,日期时间
  • (无),rating_level
  • (无),日期时间

Performant查询将匹配为复合索引定义的键和排序顺序(asc / desc),或从左到右的键的正确子集。

如果您在“工具,用户名,rating_level”上只有一个索引,则无法有效支持上面列出的任何您的查询。

您建议的索引对查询有用:

  • 工具
  • 工具,用户名
  • 工具,用户名,rating_level

要返回结果而不必执行内存中排序,复合索引中的排序顺序应与查询中的排序顺序相匹配。

例如:

db.collection.find({tool:1}).sort({rating_level: -1})

...理想情况下需要索引

{tool:1, rating_level:-1}

鉴于您的排序顺序可能包括升序和升序。降序变化,可能需要大量索引才能有效地覆盖所有查询变体。

您必须考虑查询性能与索引维护和存储开销的权衡。

需要考虑的一些方法包括:

  • 添加所有必需的索引。只有10,000份文件,这样做可能是合理的。

  • 针对最常见的查询优化索引。使用explain()命令可以更好地了解查询如何使用索引。

  • 调整数据模型以简化索引。例如,您可以考虑使用多键数组,以便工具和用户名是可以包含在同一索引中的键/值对。

  • 调整应用程序用户界面以简化查询和排序排列的数量。

一些有用的参考资料: