有没有办法在MongoDB中捕获覆盖不良的查询?

时间:2015-05-07 17:31:41

标签: mongodb indexing

我已启用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
}

2 个答案:

答案 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!