我已启用notablescan参数来阻止非索引的数据库查询运行:
db.getSiblingDB("admin").runCommand( { setParameter: 1, notablescan: 1 })
这对于我们尚未涵盖的查询非常有用,但我正在寻找一种方法来为未充分覆盖的查询实现相同的行为。
{
"_id" : ObjectId("53ea97c07567085b548b49c0"),
"site_id": 1,
"created_date" : ISODate("2014-08-12T22:40:00.746Z")
}
db.users.ensureIndex({'created_date':1})
db.users.find({'user_id': 1}).sort({'created_date': -1})
error: {
"$err" : "Unable to execute query: error processing query: ns=collect.user limit=0 skip=0\nTree: site_id == 1.0\nSort: {}\nProj: {}\n No query solutions",
"code" : 17007
}
答案 0 :(得分:0)
我目前所做的是启用profiling
$ mongo your_db
> db.setProfilingLevel(2)
这会查询所有查询,并存储执行所需时间的记录。
然后准备一个夜间的cron作业,为你提供当天最慢的10个查询:
#!/bin/bash
now=$(date --iso-8601=date --utc -d "-1 day")
results=$(mongo your_db --eval "db.system.profile.find( { ts: {\$gte: ISODate('$now')} } ).sort({millis: -1}).limit(10).forEach(function(e){printjson(e);})"
)
host=$(hostname)
mail -s "Mongo Slow Queries for $now@$host" your.email@gmail.com << HERE
$results
HERE
因此,最后,您只是对发生的任何性能问题做出反应(并添加适当的索引)。并非所有集合都需要索引。
当然,您可以将脚本更改为输出到文件而不是电子邮件,并根据您的需要将其设置为每小时或每周运行。
答案 1 :(得分:0)
我查看过Mongo支持并且他们已经提到了未来的3.2版本,可能包括添加索引计数器工具的功能,但是现在分析器是最好的选择。谢谢@Martin!