26

有没有办法在 mongodb 中找到不使用索引或速度慢的查询?在 MySQL 中,可以使用配置文件中的以下设置:

log-queries-not-using-indexes = 1
log_slow_queries = /tmp/slowmysql.log
4

6 回答 6

22

MongoDB 中的等效方法是使用查询分析器来跟踪和诊断慢查询。

为数据库启用分析后,缓慢的操作将写入system.profile上限集合(默认情况下为 1Mb 大小)。slowms您可以使用参数调整慢速操作的阈值(默认为 100 毫秒)。

于 2013-08-27T06:42:43.883 回答
16

首先,您必须设置您的分析,指定您想要的日志级别。3个选项是:

  • 0 - 注销
  • 1 - 记录慢查询
  • 2 - 记录所有查询

您可以通过使用以下选项运行您的mongod守护程序来做到这一点:--profile

mongod --profile 2 --slowms 20

这样,日志将被写入system.profile集合,您可以在集合上执行如下查询:

  • 查找某个集合中的所有日志,按时间戳升序排列:

db.system.profile.find( { ns:/<db>.<collection>/ } ).sort( { ts: 1 } );

  • 查找超过 5 毫秒的查询日志:

db.system.profile.find( {millis : { $gt : 5 } } ).sort( { ts: 1} );

于 2015-02-09T05:17:09.543 回答
7

您可以使用以下两个 mongod 选项。第一个选项使不使用索引的查询失败(仅 V 2.4),第二个记录查询慢于一些毫秒阈值(默认为 100 毫秒)

--notablescan

Forbids operations that require a table scan.

--slowms <value>

Defines the value of “slow,” for the --profile option. The database logs all slow queries to the log, even when the profiler is not turned on. When the database profiler is on, mongod the profiler writes to the system.profile collection. See the profile command for more information on the database profiler.
于 2013-08-26T19:38:10.043 回答
5

您可以使用命令行工具mongotail从控制台中的分析器中读取日志,并使用更易读的格式。

首先激活分析器并设置阈值(以毫秒为单位),以便分析器认为操作很慢。在以下示例中,名为“sales”的数据库的阈值设置为 10 毫秒:

$ 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
....
于 2016-08-15T00:21:50.937 回答
2

万一有人从谷歌那里结束了这个老问题,我发现这explain真的帮助我修复了我可以看到导致COLLSCAN日志中的特定查询。

例子:

db.collection.find().explain()

这将让您知道查询是使用COLLSCAN(基本光标)还是index(BTree)等。

https://docs.mongodb.com/manual/reference/method/cursor.explain/

于 2017-04-21T18:37:19.890 回答
-4

虽然您显然可以使用 Profiler,但 Mongo DB 的一个非常简洁的功能,因为我真正爱上了它是 Mongo DB MMS。耗时不到 60 秒,可以在任何地方进行管理。我相信你会喜欢的。 https://mms.mongodb.com/

于 2014-05-08T08:31:50.990 回答