Как найти запросы, не использующие индексы или медленные в mongodb
Есть ли способ найти запросы в mongodb, которые не используют индексы или являются SLOW? В MySQL это возможно со следующими настройками внутри файла конфигурации:
log-queries-not-using-indexes = 1
log_slow_queries = /tmp/slowmysql.log
спасибо,
Дмитрий
Ответы
Ответ 1
Эквивалентным подходом в MongoDB было бы использовать профилировщик запросов для отслеживания и диагностики медленных запросов.
С профилированием, включенным для базы данных, медленные операции записываются в коллекцию system.profile
capped (которая по умолчанию имеет размер 1 Мб). Вы можете настроить порог для медленных операций (по умолчанию 100 мс) с помощью параметра slowms
.
Ответ 2
Сначала вы должны настроить профилирование, указав, какой уровень журнала вы хотите. Возможны 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} );
Ответ 3
Вы можете использовать следующие две опции mongod. Первый вариант не отвечает запросами, не использующими индекс (только для V 2.4), второй записывает запросы медленнее, чем порог ms (по умолчанию - 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.
Ответ 4
Вы можете использовать инструмент командной строки mongotail, чтобы прочитать журнал из профилировщика в консоли и с более читаемым форматом.
Сначала активируйте профайлер и установите пороговое значение в миллисекундах, чтобы профиль считал операцию медленной. В следующем примере порог устанавливается в 10 миллисекунд для базы данных с именем "sales":
$ 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
....
Ответ 5
Если кто-то попадает сюда из Google по этому старому вопросу, я обнаружил, что explain
действительно помог мне исправить определенные запросы, которые, как я мог видеть, вызывали COLLSCAN
из журналов.
Пример:
db.collection.find().explain()
Это даст вам знать, использует ли запрос COLLSCAN
(Basic Cursor) или index
(BTree).
https://docs.mongodb.com/manual/reference/method/cursor.explain/
Ответ 6
Хотя вы, очевидно, можете использовать Profiler очень аккуратную особенность Mongo DB, из-за которой я действительно влюбляюсь в нее, это Mongo DB MMS.
Принимает менее 60 секунд и может управлять из любого места. Я уверен, вы полюбите его.
https://mms.mongodb.com/
Ответ 7
Я использую https://worktheme.com. Кажется, до сих пор все запросы, связанные с запросами.
Я думаю, что MMS - это служба мониторинга для экземпляра db, аналогичная мониторингу инфраструктуры. Он основан на наличии нескольких счетчиков и построении их по времени (временные ряды данных). Однако он не дает большого понимания запросов, таких как осведомленность о типах запросов, их воздействии и т.д.