有没有办法,我可以保护我的应用程序对MongoDB中查询速度慢的方法吗? 我的应用程序吨的过滤器的可能性,我监控所有这些查询,但在同一时间,我不想妥协,因为缺少索引定义的性能。
Answer 1:
该“notablescan”选项,如@ghik提到,会阻止您运行的是由于不使用索引查询速度慢。 然而,该选项是全局的服务器,它是不适合在生产环境中使用。 它也不会保护你从慢查询除了表扫描的任何其他来源。
不幸的是,我不认为有一种方法可以直接做你想要现在的东西。 有一个JIRA票提议增加一个$ MAXTIME或$ maxScan查询参数,这听起来像它会帮助你,请为它投票的: https://jira.mongodb.org/browse/SERVER-2212 。
Answer 2:
还有在客户端可用的选项(在2.6版本开始maxTimeMS)。
在服务器端,没有吸引人的全局选项,因为它会影响所有数据库和所有的操作,甚至是那些系统需要对内部操作长时间运行(例如拖尾复制OPLOG)。 此外,也可能是好一些的查询来设计长时间运行。
解决这个正确的方法是监测当前通过脚本运行查询和杀死那些长时间运行和用户/客户端发起的的-那么你可以建立例外是由设计长时间运行,或有不同的阈值查询不同的查询/收藏/等。
然后,您可以使用db.currentOp()方法 (在shell)来查看当前运行的所有操作。 字段“secs_running”指多长时间操作已运行。 要小心,不要杀不是由您的应用程序/客户端发起任何长期运行的操作 - 这可能是一个必要的系统操作,如块迁移分片集群(如只是一个例子)。
Answer 3:
现在,版本2.6
,这是可能的。 在他们的新闻稿中 ,你可以看到如下:
与MaxTimeMS运营商和开发者可以指定查询的自动注销,提供资源利用的更好的控制;
因此与MaxTimeMS你可以指定你有多少时间允许执行查询。 例如,我不想要一个特定的查询运行超过200毫秒。
db.collection.find({
// my query
}).maxTimeMS(200)
什么是酷的这个,就是你可以指定不同的操作不同的超时。
要回答OP的在评论的问题 。 没有这个全局设置。 一个原因是,不同的查询可以有不同的最大容忍时间。 例如,你可以查询,通过它的ID找到用户信息。 这是很常见的操作,必须运行超快速(否则,我们正在做的事情是错误的)。 所以我们不能忍受超过200毫秒运行的时间更长。
但是,我们也有一些聚集查询,这是我们每天运行一次。 对于这种操作它是确定4秒运行。 但是,我们不能忍受超过10秒。 因此,我们可以把10000作为maxTimeMS。
Answer 4:
我想目前还通过传递的时间参数查询杀不支持。 虽然在开发端,可以设置探查级别为2级它将记录已发出的每个查询。 从那里,你可以看到哪些查询需要多少时间。 我知道它不是什么你到底想要的,但它有助于获得什么的所有查询的脂肪,然后在你的应用程序逻辑,你可以有一些办法妥善处理这样的情况下,这些查询可能会发起的洞察力。 我通常用这个方法去和它帮助。