MongoDB. Часть 5. Индексы
Apr 28, 2015 04:05 · 692 words · 4 minutes read
Индексы в MongoDB
В прошлом посте о MongoDB мы научились искать медленные запросы. Теперь поговорим о том, как сделать так, чтобы они не тормозили :) Для начала стоит отметить, что тормозят, в основном, запросы на выборку данных. С каждым днем запросы начинают выполняться все дольше и дольше, работа с БД отнимает все больше времени, а сил терпеть все это остается все меньше :) В конце концов возникает необходимость каким-то образом ускорить запросы. Вот в этом случае нам на помощь приходят индексы.
Что такое индекс? Индекс — специальная структура данных, которая оптимизирована для поиска. Чаще всего в качестве такой структуры выступают сбалансированные деревья (BTree). Они применяются для построения индексов в большинстве реляционных и noSQL баз данных.
За счет чего поиск по этим структурам осуществляется быстрее?
MongoDB хранит индексы в оперативной памяти. Если памяти начинает не хватать, то она вытесняет редко используемые индексы на диск. В идеале, MongoDB необходим объем памяти, в которую могли бы входить все индексы. В индексе содержится меньше данных, чем в самой коллекции. Сбалансированное дерево обеспечивает быстрый поиск.
Индексы могут быть: - Одиночными: индексы, состоящие из одного поля - Составными: индексы, в которых присутствует несколько полей - Индексы по нескольким ключам массива: если индексируемое поле массив, то будут проиндексированы его ключи Также индексы можно разделить по типам данных: - Гео-индексы: предназначены для поиска по координатам - Текстовые индексы: предназначены для полнотекстового поиска
Построение индекса
Для того, чтобы построить индекс по одной из коллекции в MongoDB, необходимо выполнить следующую команду:
db.collection_name.ensureIndex(
{“index_field_1”:1, “index_field_2”:1 }
{“name” :”index_name“, “background”:1}
)
где index_filed1, index_filed2 - поля, по которым будет строится индекс. 1 - флаг включение поля в индекс. В качестве второго аргумента принимается объект c дополнительными параметрами. Например, name - название индекса. Background - задание построения индекса в фоновом режиме.
Если вы строите индексы, то старайтесь строить индексы в фоновом режиме. За это отвечает параметр background. Это значит, что БД будет строить индекс в фоне, и это не скажется на времени выполнения текущих запросов. Если же выполнить запрос на построение индекса без параметра background, то БД начнет сразу строить индекс.Это заблокирует запросы, но скажется на времени построения индекса. Он будет построен быстрее.
Вредные советы
Мы можем предложить несколько советов из нашего опыта, для построения индексов:
Важно то, в каком порядке идут поля в запросе. Они должны повторять порядок полей в индексе. Если поля будут идти не в таком порядке, существует вероятность того, что индекс для запроса использоваться не будет. Для запроса будет использоваться тот индекс, порядок полей которого максимально удовлетворяет порядку полей в запросе. В случае с MongoDB нужно по мере возможности добавлять поле, которое используется для сортировки, в индекс. Поле, используемое для сортировки, должно быть последним в индексе. Тогда результатом поискового запроса будет уже отсортированный массив данных. Если же поле, по которому производится сортировка, будет отсутствовать в индексе, то MongoDB отсортирует полученные данные в памяти. Сортировка в памяти - это очень дорогая операция. Её следует избегать, особенно при получении большого количества данных.
Также следует добавлять поля в индекс по порядку убывания их селективности. Это значит, что в начале индекса должны идти поля, запрос по которым отсечет как можно больше данных от результата выборки данных.
В качестве общей рекомендации, можно сказать, что порядок полей в индексе должен быть такой: поля, которые используются при поиске на точные значения; сортируемые поля; поля для поиска по диапазонам.
Перед тем, как выполнить запрос, MongoDB пытается определить, какой индекс лучше всего подходит для этого запроса. Для этого происходит запуск запроса с использованием разных индексов. Это называется план запроса. БД смотрит, по какому из планов было просканировано меньше записей, и кэширует его. В качестве результата выполнения плана кэшируется количество записей, которое было просканировано, и то, какой индекс был использован. MongoDB при следующем таком же запросе будет использовать индекс, сохраненный в плане. При каких условиях БД обновит закэшированный план? Это может произойти при следующих условиях: - произведено больше 100 операций записи в коллекцию; - изменился состав индексов в коллекции; - было просканировано в 10 раз больше записей, чем закэшировано в плане. При выполнении одного из этих условий, план запросов будет перестроен.
Итак, теперь вы обладаете Знанием по работе с индексами в MongoDB :) Рассчитываем, что это сэкономит Вам не мало сил и времени. Спасибо за внимание и до новых встреч! ;)