我有以下用于在我的网络应用中查询提示的代码。我试图找出如何优化此代码以更快地运行。目前,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);
});
答案 0 :(得分:0)
您在代码中生成了几种不同的查询模式和排序组合:
Performant查询将匹配为复合索引定义的键和排序顺序(asc / desc),或从左到右的键的正确子集。
如果您在“工具,用户名,rating_level”上只有一个索引,则无法有效支持上面列出的任何您的查询。
您建议的索引对查询有用:
要返回结果而不必执行内存中排序,复合索引中的排序顺序应与查询中的排序顺序相匹配。
例如:
db.collection.find({tool:1}).sort({rating_level: -1})
...理想情况下需要索引
{tool:1, rating_level:-1}
鉴于您的排序顺序可能包括升序和升序。降序变化,可能需要大量索引才能有效地覆盖所有查询变体。
您必须考虑查询性能与索引维护和存储开销的权衡。
需要考虑的一些方法包括:
添加所有必需的索引。只有10,000份文件,这样做可能是合理的。
针对最常见的查询优化索引。使用explain()
命令可以更好地了解查询如何使用索引。
调整数据模型以简化索引。例如,您可以考虑使用多键数组,以便工具和用户名是可以包含在同一索引中的键/值对。
调整应用程序用户界面以简化查询和排序排列的数量。
一些有用的参考资料: