Работа с индексами в MongoDB

{title}

Хорошо известно, что ресурсы очень ограничены в производственных средах, и что правда, что в настоящее время существуют в десять раз более мощные серверы, чем те, которые существовали 5 лет назад, однако по мере увеличения мощности этого оборудования увеличивался и запрос данных.

В зависимости от количества времени, необходимого для выполнения запроса, мы можем сказать, является ли он критическим или нет, однако, хотя это и не критично, всегда есть небольшой запас для улучшения, что позволяет сэкономить секунды выполнения, которые в конце дня преобразуются в минуты., что дает нам возможность улучшить пользовательский опыт.

требования

Для выполнения этого урока нам нужна функциональная установка MongoDB с достаточными разрешениями, чтобы мы могли работать в командной консоли.

Нам также нужен набор данных или документов, чтобы заполнить нашу коллекцию, в предыдущих уроках мы предлагали набор исходных данных, однако для тех, у кого их нет, они могут использовать это:

 db.guiamongo.insert ({"имя": "Мария", "возраст": "25", "пол": "женщина", "страна": "Колумбия"}); db.guiamongo.insert ({"имя ":" Педро ", " возраст ":" 32 ", " пол ":" мужчина ", " страна ":" Эквадор "}); db.guiamongo.insert ({" name ":" Ramon ", " age " : "18", "пол": "мужчина", "страна": "Гондурас"}); db.guiamongo.insert ({"имя": "Джон", "возраст": "22", "пол": "Мужчина", "страна": "Аргентина"}); db.guiamongo.insert ({"имя": "Роза", "возраст": "45", "пол": "женщина", "страна": " Чили ", " languages ​​": [" Esp ", " Ing ", " Fra "]}); 
С этим нам хватит для небольшого старта и тем самым получим результаты упражнений, которые мы представим ниже.

1. Индексация MongoDB


Индексирование или работа с индексами - это концепция, используемая в MongoDB для реляционных баз данных, то есть, если у нас есть представление об этой концепции, мы можем понять, как она работает в MongoDB за короткое время, нам просто нужно приспособиться к конкретному синтаксису.

Работа с индексами

Если мы находимся за пределами концепции, следует отметить, что работа с индексами - это не что иное, как указание базе данных, какие поля следует использовать в памяти, чтобы сделать ваш поиск более эффективным, например, если мы просматриваем большую коллекцию документов с помощью поля с именем name идеальным вариантом было бы индексировать указанное поле так, чтобы механизм знал, что им следует руководствоваться непосредственно этим полем, при этом запросы, использующие это поле, начинают выполняться быстрее.

Чтобы создать индекс в MongoDB, мы должны использовать функцию sureIndex () и в качестве параметра передать документ JSON, указывающий поля или свойства нашего документа, которым мы должны соответствовать этот индекс. Давайте посмотрим на небольшой пример этого.

Предположим, у нас есть коллекция с именем guiamongo и мы выполняем поиск поля с именем name, код будет таким:

 db.guiamongo.find ({"name": "Name"}) 
Это обычный запрос, который не имеет ничего конкретного, единственная проблема в том, что если миллионы документов будут очень медленными, то для создания индекса мы должны указать его только следующим образом:
 db.guiamongo.ensureIndex ({"name": 1}) 
Таким образом, мы создали индекс для запроса, и если мы выполним его снова, это будет намного быстрее. Давайте посмотрим, как это выглядит в нашей консоли MongoDB :

{title}

Мы можем заметить, что как только мы создали индекс, MongoDB возвращает документ, который сообщает нам о состоянии нашей функции и о том, сколько индексов у нас было до и после приложения, дополнительно показывая нам поле ok в 1, которое указывает, что выполнение было успешным.

Предыдущий запрос весьма полезен для одного поля, но если мы сделаем следующее:

 db.guiamongo.find ({"name": "Name", "age": {"$ gt": "20"}}). sort ({"age": - 1}); 
Мы понимаем, что в этом случае предыдущий индекс больше не работает, это потому, что запрос использует другую комбинацию полей для поиска, поэтому мы должны создать новый индекс, используя то, что было изучено ранее, давайте посмотрим, как это будет:
 db.guiamongo.ensureIndex («имя»: 1, «возраст»: 1); 
Теперь, если мы рассмотрим нашу базу данных следующим образом, мы увидим, что у нас есть новый индекс в коллекции:

{title}

2. Недостаток в использовании индексов


Несмотря на огромные преимущества, которые приносят нам использование и работа с индексами, они не всегда полезны, поэтому мы должны тщательно проанализировать, прежде чем внедрять эту функцию в нашу базу данных.

Главный недостаток

Огромным недостатком использования индексов является то, что движок должен включать новые данные, которые мы вставляем в таблицу или список индексов, поэтому каждый раз, когда выполняется функция insert (), создается ряд смежных процессов, которые могут увеличиваться. Использование диска и обработка.

$config[ads_text6] not found

Другим недостатком является то, что у нас есть максимум 64 индекса на коллекцию, поэтому мы должны работать с наименьшим количеством из них в нашей базе данных, следя за тем, чтобы использовалось только то, что строго необходимо.

3. Как узнать, когда мы должны использовать индекс


Поскольку мы знаем об ограничениях и недостатках использования индексов, для того, чтобы узнать, следует ли нам их создавать или нет, нужно взять эту серию вопросов, если мы можем ответить на них все, у нас есть необходимые характеристики для создания индекса, а если мы не можем проанализируем ситуацию с другой точки зрения, давайте посмотрим на вопросы:

Какие запросы мы делаем?

Мы должны провести анализ ситуации и посмотреть, что происходит в нашей коллекции, с этим мы поймем, нужны ли нам индексы, или, может быть, нам нужно устранить некоторые из них.

Какова правильная ориентация индексов?

Нам нужно знать, как мы сортируем данные в индексах, в алфавитном или числовом порядке, по возрастанию или по убыванию, это напрямую влияет на скорость индексации.

$config[ads_text5] not found

Как это будет масштабироваться?

Мы должны подумать о росте наших данных, так как мы будем знать, будет ли работать то, что сегодня работает завтра, в 10 или 100 раз больше данных будет работать правильно.

Конечно, это только руководство, есть особые и очень особые случаи для каждого менеджера приложений, в которых вы должны применять свои критерии над учебниками этого типа, однако это хорошее руководство для начала в мире оптимизации данных.,

4. Индексы во вложенных документах


Структура документов, которые мы можем обрабатывать в MongoDB, поддается сложному хранению данных, не все данные, которые нам нужны, будут на одном уровне, поэтому необходимо создавать индексы встроенных документов . С помощью этих индексов MongoDB может индексировать данные, имеющие более сложные структуры.

$config[ads_text6] not found

Для достижения результата мы будем использовать то, что называется точечной нотацией, которая представляет собой не что иное, как доступ к полям встроенных документов, как если бы они были свойствами объекта через точку. В следующем примере мы создадим индекс этих характеристик, давайте сначала рассмотрим синтаксис.

Сначала мы вставим запись со встроенным документом в наш набор тестовых данных:

 db.guiamongo.insert ({"имя": "Хуан", "возраст": "40", "пол": "мужчина", "страна": "Бразилия", "квалификация": {"история": "85 ", " литература ":" 90 ", " курс ":" 3 "}}); 
Затем мы сделаем простой запрос в этом случае для свойства курса:
 db.guiamongo.find ({"qualification.course": "3"}); 
Теперь, если мы хотим создать индекс, мы должны просто сделать следующее:
 db.guiamongo.ensureIndex ({"qualifications.course": 1}); 
Таким образом, мы создали индекс документа, встроенного в другой документ в коллекции в MongoDB . Если вы посмотрите на это то, что мы должны были получить в консоли:

{title}

5. Используйте объяснение ()


Поскольку мы знаем, как создавать индексы, и у нас есть представление о том, когда и почему мы должны их создавать, тем не менее, мы еще не увидели инструмент, который очень важен, который позволит нам узнать немного больше и пойти дальше в наших консультациях; мы ссылаемся на объяснение (), эта функция позволяет нам узнать время и индексы, используемые в запросах.

Что это говорит нам?

Возвращение объяснения () - это документ, в котором вы указываете курсор, который вы используете для поиска, затем он указывает пределы индекса, у нас также есть поле с именем миллис и будет указывать количество времени в миллисекундах, которое Выполнение запроса требует времени, последнее очень важно при понимании производительности нашей базы данных .

$config[ads_text5] not found

Давайте посмотрим, как мы можем применить эту функцию к запросу, мы будем использовать ту, которую мы сделали в нашем предыдущем примере:

 db.guiamongo.find ({"qualification.course": "3"}). объяснение (); 
После применения он должен вернуть что-то вроде следующего:

{title}

Мы замечаем, как нам предлагают данные для анализа запроса, в курсоре мы видим, что мы использовали индекс, который мы создали в предыдущем упражнении под названием qualifications.course_1, это помогло нам достичь 0 миллисекунд выполнения, что является оптимальным временем для наших запросов. Очевидно, что поскольку это тестовая среда, у нас больше ничего не будет, но если мы сможем выполнить это упражнение на серверах с миллионами записей, мы осознаем всю мощь индексов.

$config[ads_text6] not found

На этом мы завершили это руководство, создали индексы в наших коллекциях документов и, кроме того, мы исследовали некоторые инструменты, которые помогают нам получать ключевую информацию для улучшения и, прежде всего, повышения производительности нашей базы данных .