我启用了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
}
我目前要做的是启用性能分析
$ 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" [email protected] << HERE
$results
HERE
因此,最后,您只需对出现的任何性能问题作出反应(并添加适当的索引)。并非所有集合都需要索引。
当然,您可以更改脚本以将其输出到文件而不是电子邮件中,还可以根据需要将其设置为每小时或每周运行一次。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句