Performance 如何在mongodb中查找不使用索引或速度较慢的查询
有没有办法在mongodb中查找不使用索引或速度较慢的查询?在MySQL中,通过配置文件中的以下设置,这是可能的:Performance 如何在mongodb中查找不使用索引或速度较慢的查询,performance,mongodb,mongodb-query,Performance,Mongodb,Mongodb Query,有没有办法在mongodb中查找不使用索引或速度较慢的查询?在MySQL中,通过配置文件中的以下设置,这是可能的: log-queries-not-using-indexes = 1 log_slow_queries = /tmp/slowmysql.log 您可以使用以下两个mongod选项。第一个选项使不使用索引的查询失败(仅限V2.4),第二个选项记录的查询速度低于某些毫秒阈值(默认值为100ms) ——notablescan 禁止需要表扫描的操作。 --懒汉 定义--profile选项
log-queries-not-using-indexes = 1
log_slow_queries = /tmp/slowmysql.log
您可以使用以下两个mongod选项。第一个选项使不使用索引的查询失败(仅限V2.4),第二个选项记录的查询速度低于某些毫秒阈值(默认值为100ms)
——notablescan
禁止需要表扫描的操作。
--懒汉
定义--profile选项的“slow”值。即使探查器未打开,数据库也会将所有慢速查询记录到日志中。当数据库探查器打开时,探查器将写入system.profile集合。有关数据库探查器的详细信息,请参见profile命令。
MongoDB中的等效方法是使用跟踪和诊断慢速查询
在为数据库启用配置文件的情况下,缓慢的操作会写入
system.profile
capped集合(默认情况下大小为1Mb)。您可以使用.来调整慢速操作的阈值(默认为100ms),而您显然可以使用探查器。Mongo DB的一个非常简洁的功能是Mongo DB MMS,正是因为它,我才真正爱上了它。
耗时不到60秒,可在任何地方进行管理。我相信你会喜欢的。
首先,必须设置配置文件,指定所需的日志级别。这3个选项是:
- 0-记录器关闭
- 1-记录慢速查询
- 2-记录所有查询
--profile
选项运行mongod
deamon来实现这一点:
mongod--profile 2--slowms 20
这样,日志将被写入system.profile
集合,您可以对其执行如下查询:
- 查找某个集合中的所有日志,按升序时间戳排序:
db.system.profile.find({ns:/./}).sort({ts:1})代码>
- 查找超过5毫秒的查询日志:
db.system.profile.find({millis:{$gt:5}}).sort({ts:1})代码>您可以使用命令行工具在控制台内以更可读的格式从探查器读取日志
首先激活分析器,并在配置文件中以毫秒为单位设置阈值,以考虑操作缓慢。在以下示例中,对于名为“sales”的数据库,阈值设置为10毫秒:
然后,要“实时”查看缓慢的查询,以及一些额外的信息,如每个查询所用的时间,或者需要“漫游”多少个注册表才能找到特定的结果:
$ mongotail sales -f -m millis nscanned docsExamined
2016-08-11 15:09:10.930 QUERY [ops] : {"deleted": {"$exists": false}, "prod_id": "367133"}. 8 returned. nscanned: 344502. millis: 12
2016-08-11 15:09:10.981 QUERY [ops] : {"deleted": {"$exists": false}, "prod_id": "367440"}. 6 returned. nscanned: 345444. millis: 12
....
如果有人从谷歌来这里问这个老问题,我发现explain
真的帮助我解决了我从日志中看到的导致COLLSCAN
s的特定查询
例如:
db.collection.find().explain()
这将让您知道查询是否使用了COLLSCAN
(基本光标)或索引
(BTree),以及其他内容
那么在提供了notablescan的情况下,mongod会拒绝查询吗?它是否会记录在system.profile collection中?如果出现--notablescan
错误,您将在日志中看到诸如query db.coll query:{whatever}ntoreurn:0 keydupdates:0异常:不允许表扫描:db.coll
注意,您应该只使用{--notablescan}在开发环境中。有许多简单的管理任务需要表扫描(即看到一个集合的列表或更新非索引字段),因此启用这个选项会有意想不到的后果。我会考虑这两个选项在EV EnVo中的错误选项。显然,您希望在应用程序/控制台内切换日志级别,并使用该级别记录某些查询,而不必重置deamon来执行此类操作,而且无表扫描不会记录这些查询,而是会停止them@Sammaye如果从一开始就在dev中有--notablescan
,无需记录任何内容,并强制开发使用Indexer,或者您可以执行以下操作:mongo localhost:27017并在控制台db.setProfilingLevel(2,10)中写入-这将在日志中打印花费10毫秒以上完成的所有查询perform@Bestmacros是的,这就是答案中建议的“查询分析器”。很好的工具!我能够快速地设置它,并通过本地生产数据库副本获得一些好的基准测试。
$ mongotail sales -l 1
Profiling level set to level 1
$ mongotail sales -s 10
Threshold profiling set to 10 milliseconds
$ mongotail sales -f -m millis nscanned docsExamined
2016-08-11 15:09:10.930 QUERY [ops] : {"deleted": {"$exists": false}, "prod_id": "367133"}. 8 returned. nscanned: 344502. millis: 12
2016-08-11 15:09:10.981 QUERY [ops] : {"deleted": {"$exists": false}, "prod_id": "367440"}. 6 returned. nscanned: 345444. millis: 12
....