Приветствую искателей приключений! MongoLab рада представить
Dex ! Мы надеемся, что он поможет вам в ваших квестах.
Dex — это инструмент настройки производительности MongoDB, с открытым исходным кодом под лицензией MIT, который сравнивает зарегистрированные запросы с доступными индексами в запрашиваемой коллекции (коллекциях) и генерирует предложения по индексам на основе простого практического правила. Чтобы использовать Dex, вы указываете путь к файлу журнала MongoDB и URI соединения для вашей базы данных. Dex также зарегистрирован в PyPi , так что вы можете легко установить его с помощью pip.
Быстрый старт
pip install dex
ЗАТЕМ
dex -f mongodb.log mongodb://localhost
Dex предоставляет вывод времени выполнения в STDERR, поскольку находит рекомендации:
{ "index": "{'simpleIndexedField': 1, 'simpleUnindexedFieldThree': 1}", "namespace": "dex_test.test_collection", "shellCommand": "db.test_collection.ensureIndex( {'simpleIndexedField': 1, 'simpleUnindexedFieldThree': 1}, {'background': true})" }
А также сводная статистика:
Всего прочитано строк: 7
Разобраны строки запроса: 7
Уникальные рекомендации: 5
Линии, на которые влияют рекомендации: 5
Просто скопируйте и вставьте каждое значение shellCommand в оболочку MongoDB, чтобы создать предложенные индексы.
Декс также предоставляет полный анализ STDOUT, когда он завершен, поэтому вы увидите, что эта информация повторяется до выхода из Dex. Вывод в STDOUT является полностью JSON-версией вышеупомянутого, поэтому Dex может быть частью автоматизированной цепочки инструментов.
Для получения дополнительной информации ознакомьтесь с README.md и ознакомьтесь с исходным кодом по адресу https://github.com/mongolab/dex . Или, если вы испытываете дополнительные приключения, возитесь с источником самостоятельно!
git clone https://github.com/mongolab/dex.git
Мотивация Dex
MongoLab управляет десятками тысяч баз данных MongoDB, повышая нашу чувствительность к медленным запросам и их влиянию на процессор. Что началось как наборОперативная эвристика была представлена как автоматизированный инструмент. Например, «Создайте индексы с этим порядком: сначала укажите точные значения. Сортировка полей следующая. Дальние поля после этого . Он очень хорошо сработал для нас, и мы надеемся, что он будет работать и для ваших собственных баз данных MongoDB, даже если вы никогда не размещаете его у нас. Мы продолжим улучшать Dex — смотрите дальнейшие указания ниже — и будем рады вашим отзывам, предложениям и запросам.
Как это работает
На высоком уровне Декс читает журнал MongoDB и выполняет три шага:
- Разобрать запрос
- Оценить существующие индексы по запросу
- Рекомендовать индекс (если необходимо)
Шаг 1: Разбор запроса
Каждый запрос анализируется во внутреннем представлении, которое классифицирует каждый термин запроса в одно из:
- EQUIV — стандартная проверка эквивалентности; пример: {a: 1}
- SORT — предложение sort / orderby; пример: .sort ({a: 1})
- RANGE — проверка диапазона или набора: в
частности: «$ ne», «$ gt», «$ lt», «$ gte», «$ lte», «$ in», «$ nin», «$ all», «не $» - НЕ ПОДДЕРЖИВАЕТСЯ
- Композитный ($ and, $ or, $ nor)
- Вложенные «операторы», не включенные в ДИАПАЗОН выше.
Шаг 2: Оценка существующих индексов по запросу
Запрос оценивается по каждому индексу по двум критериям:
- Покрытие (нет, частичное, полное) — менее детальное описание покрытых полей. Ничто не соответствует Полям, Покрытым 0 и указывает, что индекс не используется запросом. Полный означает, что количество покрытых полей равно количеству полей в запросе. Частичное описание любого значения поля, охватываемого значением между None и Full.
- Порядок (идеальный или нет) — описывает, является ли индекс частично упорядоченным в соответствии с представлением Декса об идеальном порядке индекса. Это понятие порядка:
Эквивалентность ○ Сортировка ○ Диапазон
Это упорядочение представляет собой синтез традиционного подхода к индексированию и практического правила, разработанного во избежание дорогостоящих операций MongoDB scanAndOrderoperations при выполнении запросов с сортированным диапазоном. Примечание: геопространственные запросы и индексы не поддерживаются. Оценка индекса выполнена, но Dex не даст рекомендаций для геопространственных запросов. Анализ продолжается, но индекс больше не рассматривается для рекомендаций.
Шаг 3: Рекомендовать индекс (при необходимости)
Когда оценка завершена, Декс считает идеальный индекс таким, чтобы охват был «полным», а идеальный порядок — истинным. Если эти условия не выполняются, а сам запрос не содержит условий UNSUPPORTED, Декс рекомендует идеальный индекс (с порядком индекса 1 для всех полей).
Примечание: Dex на самом деле не нужно смотреть на существующие индексы, чтобы предложить идеальный индекс для данного запроса. Но Dex рассматривает существующие индексы как любезность для пользователей, у которых они уже есть — как для анализа частичных индексов (в подробном режиме), так и для того, чтобы не предлагать индексы, которые уже существуют.
Будущие направления
- Анализаторы строк: лучший охват строк журнала с целью полного охвата всех индексируемых запросов.
- Проанализируйте коллекцию system.profile с опцией -p
- Ограничить анализ временным диапазоном с параметром -t
- Добавьте собственный Dex «SLOW_MS», чтобы при желании сузить результаты
- Поддержка геопространственных запросов
- Улучшено кэширование рекомендаций, хранение запросов по маске и суммирование:
- Количество похожих запросов
- Время потрачено
- Мин. / Макс. Временной диапазон
- Мин. / Макс.
- Улучшенные рекомендации:
- Объединять похожие рекомендации (или генерировать рекомендации из нескольких похожих запросов)
- Измерьте количество элементов (структура агрегации yay) в коллекции, чтобы указать рекомендуемый порядок ключей индекса.
Вывод
Мы очень рады Dex в MongoLab и с нетерпением ждем многих улучшений, которые возможны в области автоматизации MongoDB. Сегодня, 19 июня, я представляю Dex на июньской группе пользователей MongoDB в Сан-Франциско. Если вы можете сделать это в такой короткий срок, ознакомьтесь с подробностями здесь . Мы свяжемся со ссылкой на слайды презентации через некоторое время.
Наконец, для тех, кто интересуется знаниями в области индексирования, которые мы накопили при создании Dex, посетите мой блог Cardinal $ ins здесь .
Как всегда, удачи там!