2016-05-10 3 views
0

У меня есть 6 индексированных полей в моей коллекции. Мое приложение использует агрегированные запросы с различными комбинациями из них. Вот несколько возможных примеров:MongoDB понимает составные индексы

1. {$match: {$and: [{field1: {$in: [1,2,3]}}, {$field5: {$gt: 8}}]}} 
2. {$match: {$and: [{field2: {$nin: [4,5,6]}}, {$field5: {$lte: 8}}, {$field6: 5}]}} 
3. {$match: {field1: {$in: [7,8,9]}}} 

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

Должен ли я создавать индексы для каждой комбинации полей (я имею в виду, как {field1: 1, поле2: 1}, {field1: 1, field2: 1, field3: 1} и т.д.), или я могу просто сделать один индекс соединения для всех полей, таких как {field1: 1, field2: 1, field3: 1, field4: 1, field5: 1, field6: 1}?

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

ответ

0

Если какое-либо из 6 полей может быть в запросе, вы можете изменить свою shema и вместо того, чтобы отдельные поля создавали массив пар ключ/значение.

{values: [n:"field1", v: "meerkat", n:"field2", value:"mongoose"] } 

Теперь вы можете определить один составной индекс, охватывающий все поля.

{"values.n": 1, "values.v": 1} 

Ваш запрос будет выглядеть следующим образом:

{ "values": { "$elemMatch" : { v:"field1", v:"meerkat" } } 
+0

Благодарим за отзыв. Общая проблема заключается в том, что мое приложение использует все комбинации полей, я имею в виду, что в моих запросах нет комбинаций полей. – vadimb

+0

В этом случае наилучшим вариантом является индексирование каждого поля отдельно, что, конечно же, повлияет на производительность записи. Альтернативно, если эти поля содержат текстовые данные, вы можете использовать текстовый индекс для всех полей. https://docs.mongodb.com/manual/core/index-text/#wildcard-text-indexes – Kiril

+0

Предоставлено другое предложение – Kiril

0

Ваш второй способ будет работать, но изменить порядок сортировки.

Две вещи, чтобы отметить:

  1. Индекс поддерживает запрос, когда индекс содержит все поля, отсканированные запросом. Запрос проверяет индекс, а не коллекцию. Создание индексов, поддерживающих запросы, приводит к значительному увеличению производительности запросов.

  2. Если вы иногда запрашиваете только один ключ и в другое время запрашиваете этот ключ в сочетании со вторым ключом, то создание составного индекса более эффективно, чем создание индекса с одной клавишей. MongoDB будет использовать составной индекс для обоих запросов. Один составной индекс в нескольких полях может поддерживать все запросы, которые ищут подмножество «префикс» этих полей.

Пример:

Следующий индекс по коллекции:

{х: 1, у: 1, г: 1} Может поддерживать запросы, которые следующие индексы поддерживают :

{x: 1} {x: 1, y: 1} Есть ситуации, когда префиксные индексы могут предлагать лучше производительность запроса: например, если z - большой массив.

Индикатор {х: 1, у: 1, г: 1} индекс может также поддерживать многие из тех же запросов, как следующий индекс:

{х: 1, г: 1} Кроме того, {х : 1, z: 1}. С учетом следующего запроса:

db.collection.find ({x: 5}) .sort ({z: 1}) Индекс {x: 1, z: 1} поддерживает как запрос, так и операцию сортировки , а индекс {x: 1, y: 1, z: 1} поддерживает только запрос. Для получения дополнительной информации о сортировке см. Use Indexes to Sort Query Results.

Basic Пример для сортировки по нескольким полям:

Вы можете указать сортировку всех ключей индекса или на подмножестве; однако ключи сортировки должны быть указаны в том же порядке, что и в индексе. Например, шаблон ключа индекса {a: 1, b: 1} может поддерживать сортировку на {a: 1, b: 1}, но не на {b: 1, a: 1}.

Для запроса использования составного индекса для сортировки указанное направление сортировки для всех ключей в документе cursor.sort() должно соответствовать шаблону ключа индекса или соответствовать обратному шаблону ключа индекса. Например, шаблон ключа индекса {a: 1, b: -1} может поддерживать сортировку по {a: 1, b: -1} и {a: -1, b: 1}, но не на {a: - 1, b: -1} или {a: 1, b: 1} Read this.

Смежные вопросы