- Оригинальный адрес:Improve MongoDB Performance Using Projection
- Оригинальный автор:Tek Loon
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:onlinelei
- Корректор:ivileey,loststar
Улучшите производительность MongoDB с помощью карт
В этой статье описаны все мои выводы и проанализировано улучшение производительности запросов при использовании карт в MongoDB. В конце статьи мы узнаем, можем ли мы улучшить производительность запросов в MongoDB с помощью сопоставления.
Без дальнейших церемоний, давайте начнем.
описание проблемы
Этот пост был вдохновлен тем, что я использовал в работекартаЗапросить данные в базе данных MongoDB. Сопоставление ** «укажите возвращаемое поле набора результатов при запросе в документе» ** Для получения подробной информации обратитесь к официальному MongoDB.Документация
Подобно покупке гамбургера в McDonald's, мы можем заказать несколько блюд вместо пакета, включающего напиток и картофель фри.
Поэтому я хотел бы посмотреть, насколько производительность запросов может быть улучшена с помощью карты. Вот основные цели:
Основная цель:
- Проверьте, улучшает ли использование карты при тестировании MongoDB производительность запросов.
- Найдите лучшее решение для использования картографических запросов в MongoDB.
Анализ решения
Мне нравится пошаговый подход к исследованию проблем. На этот раз то же самое:
- Мне нужен документ с более чем полумиллионом единиц данных. Таким образом, мы можем четко использовать время запроса, чтобы отличить разницу в производительности между использованием карты и ее неиспользованием.
- Я подозреваю, что наличие коллекции вложенных документов увеличивает время запроса, поэтому мы готовим вложенные документы.
При подготовке соответствующих данных см. следующие скриншоты. Виртуальные данные о том, как создать миллионный уровень, см. здесь.статья.
Как вы можете видеть на скриншоте выше, мы создали 500 000 документов со следующими полями:
-
booking_no
- номер рейса -
origin
- источник -
destination
- назначения -
persons
- путем включения姓
,名
и出生日期
массив объектов
тест производительности
Прежде чем начинать эксперименты с производительностью, убедитесь, что все настройки верны. кроме значения по умолчанию_id
Кроме полей, никакие другие индексы не создаются.
Вот эксперимент, который я хочу продемонстрировать:
- Эксперимент 1. Улучшается ли производительность запросов при меньшем количестве отображаемых полей?
- Эксперимент 2. Если уменьшение количества полей не повышает производительность запросов, какие еще есть способы повысить производительность запросов?
Эксперимент 1. Улучшается ли производительность запросов при меньшем количестве отображаемых полей?
К сожалению, производительность не улучшилась. Но индексация всех запрашиваемых полей улучшит производительность запросов, о чем я расскажу в следующей главе.
В этом эксперименте мы запрашиваем все заказы на рейс с пунктом назначения «Герлахмут». Из 500 000 заказов 93 заказа соответствовали условиям. Посмотрим, сколько времени это займет.
Чтобы увидеть прошедшее время, я использовал функцию объяснения Mongo Shell.
На приведенном выше снимке экрана сопоставление не используется. Время запроса заняло 461 мс. Хотя используется приведенная ниже карта, время запроса составляет 505 миллисекунд.
Использование карты не улучшило производительность, но заняло больше времени.
Используя карту в запросе, вывод из эксперимента 1 - нет улучшения производительности. 👎👎
Эксперимент 2. Если уменьшение количества полей не повышает производительность запросов, какие еще есть способы повысить производительность запросов?
Из-за провала первого эксперимента я заглянул в университет MongoDB.Курс по оптимизации производительности. Этот курс бесплатный, если вы хотите пройти курс по оптимизации производительности MongoDB, нажмите на предыдущую ссылку.
Затем я обнаружил покрывающие индексы. Согласно официальной MongoDBДокументацияВ описании покрывающий индекс — это «запрос, который может полностью использовать индекс без доступа к документу».
Возьмем в качестве примера приготовление пищи: когда вы хотите приготовить еду, все ингредиенты, которые вам нужны, уже готовы в холодильнике, все, что вам нужно сделать, это обработать их.
Прежде чем мы создадим какой-либо индекс, нам нужно знать, какие поля мы ожидаем вернуть, например, в следующих случаях.
- Администратор хочет знать все заказы на рейс до определенного пункта назначения. Информация о заказе содержит
航班号
,始发地
и目的地
.
Из того, что мы знаем выше, мы можем создать два индекса.
- пункт назначения - в
目的地
Создайте индекс в поле. - Пункт назначения, отправление и номер рейса. — мы можем использовать поле
目的地
,始发地
и航班号
Создайте на нем федеративный индекс.
Как создать индекс, пожалуйста, обратитесь к команде ниже.
запрос без сопоставления
Сначала ищем заказы, предназначенные для «Герлахмута». На снимке экрана ниже показано время, затраченное на запрос. Очевидно, что время выполнения сокращается до5 мс. быстрее, чем без использования индексов100 раз.
Вы можете подумать, что это здорово, но это не лучший результат. в настоящее время используетиндекс покрытияВ случае , скорость запроса может быть улучшена250 раз.
Запрос с использованием карты (индекс покрытия)
Использование покрывающего индекса означает, что все нужные нам поля включены в индекс.
Используя покрывающий индекс, время запроса может быть аппроксимировано2 мс, производительность, вероятно, улучшится по сравнению с тем, чтобы не использовать индекс60%.
Помимо сокращения времени, затрачиваемого на выполнение запроса, мы также улучшили стратегию запроса. Как видно из рисунка, сам индекс уже содержит поля, необходимые для запроса. Таким образом, нам не нужно запрашивать какие-либо документы, что повышает общую производительность запросов.
Суммировать
В центре внимания этой статьи:
- Запрос меньшего количества полей не повышает производительность, если только все поля, которые необходимо вернуть, не находятся в индексе.
- Индексы могут повысить производительность запросов, а если это покрывающий индекс, то производительность значительно повысится.
- Покрытие индекса почти на 60% быстрее, чем без него.
Спасибо за чтение, следующая статья видна.
Ссылаться на
- Поле проектов из запроса — MongoDBDocumentation
- A Thorough Explanation from StackOverflow
- Объяснить вывод — MongoDBDocumentation
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.