2013-08-26 1 views
20

Есть ли способ найти запросы в mongodb, которые не используют индексы или являются SLOW? В MySQL это возможно со следующими настройками внутри файла конфигурации:Как найти запросы, не использующие индексы или медленные в mongodb

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

ответ

17

эквивалентный подход в MongoDB будет использовать query profiler для отслеживания и диагностики медленные запросы.

С профилированием, включенным для базы данных, медленные операции записываются в сборку system.profile (которая по умолчанию имеет размер 1 Мб). Вы можете настроить порог для медленных операций (по умолчанию 100 мс), используя slowms parameter.

+0

спасибо Stennie! Специально для ссылки dex :) – DmitrySemenov

+0

или вы можете сделать следующее: mongo localhost: 27017 и написать в консоли db.setProfilingLevel (2,10) - это будет печатать в журнале все запросы, которые заняли более 10 мс для выполнения – Bestmacros

+0

@Bestmacros да, это «запрос профилировщик», предложенный в ответе. – Madbreaks

6

Вы можете использовать следующие две опции 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. 
+0

Таким образом, в случае --notablescan предоставляется - запрос будет отклонен mongod? Будет ли он зарегистрирован в коллекции system.profile? – DmitrySemenov

+0

В случае '--notablescan' будет возвращена ошибка, и вы увидите в журнале что-то вроде' query db.coll query: {whatever} ntoreturn: 0 keyUpdates: 0 exception: table scans not allowed: db. coll' –

+1

Обратите внимание, что вы должны использовать {{--notablescan}} только в среде разработки. Существует множество простых задач администратора, требующих сканирования таблиц (т. Е. Просмотра списка коллекций или обновления неиндексированных полей), поэтому включение этой опции может иметь неожиданные последствия. – Stennie

-4

Хотя вы, очевидно, можете использовать Profiler очень аккуратную особенность Mongo DB, из-за которой я действительно влюбляюсь в нее, это Mongo DB MMS. Принимает менее 60 секунд и может управлять в любом месте. Я уверен, вы полюбите его. https://mms.mongodb.com/

11

Прежде всего, вы должны настроить профилирование, указав, какой уровень журнала вы хотите. 3 варианта являются:

  • 0 - регистратор от
  • 1 - журнал медленных запросов
  • 2 - регистрировать все запросы

Вы можете сделать это, запустив mongod Deamon с --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});

2

Вы можете использовать средство командной строки mongotail для чтения журнала из профилировщика в консоли и с более читаемым форматом.

Сначала активируйте профайлер и установите пороговое значение в миллисекундах, чтобы профиль считал операцию медленной.В следующем примере порог установлен в 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 
.... 
+0

Хороший инструмент! Я смог быстро настроить его и получить хорошие ориентиры с локальной копией базы данных. –

0

в случае, если кто заканчивает здесь от Google на этот старый вопрос, я обнаружил, что explain действительно помог мне исправить конкретные вопросы, которые я могли видеть COLLSCAN s из журналов.

Пример:

db.collection.find().explain()

Это даст вам знать, если запрос использует COLLSCAN (Basic курсора) или index (BTree), среди других вещей.

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

 Смежные вопросы

  • Нет связанных вопросов^_^