Предположим, я создаю индекс, подобный следующему: -

db.collection.createIndex( { propA: 1, propB: 1, propC:1 } )

И я запрашиваю следующее: -

db.collection.find({propB:'x', propC: 'y', propA:'z'})

Будет ли механизм запросов mongo использовать созданный выше индекс или нет. Имеет ли значение последовательность ключевых слов при использовании составного индекса при написании запроса?

1
Anand 2 Май 2016 в 11:14

2 ответа

Лучший ответ

Порядок ключей в запросе не имеет значения: MongoDB достаточно умен, чтобы просмотреть все запрашиваемые свойства и найти подходящий индекс.

Однако порядок ключей, определенных в индексе , имеет значение: составной индекс можно использовать для сопоставить запросы с любым префиксом его ключей в том порядке, в котором они определены в индексном документе. Таким образом, указанный выше индекс можно использовать для ответа на такие запросы, как {propA: 'x', propB: 'y'}, но не для таких запросов, как {propB: 'y', propC: 'z'}.

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

2
Avish 2 Май 2016 в 08:20

Чтобы добавить к ответу Avish, такой индекс, состоящий из более чем одного поля, называется составным индексом. Порядок полей, перечисленных в составном индексе, очень важен. Вот почему:

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

Например, в вашем случае индекс будет содержать ссылки на документы, отсортированные сначала по значениям поля propA, а внутри каждого значения поля propA, отсортированные по значениям поля propB и в каждом значении поля propB, отсортированные по значения поля propC.

Так что имейте в виду, что следующие запросы будут использовать данный индекс:

  • db.collection.find ({propA: 'z'})
  • db.collection.find ({propB: 'x', propC: 'y', propA: 'z'})
  • db.collection.find ({propB: 'x', propA: 'z'})

Следующие элементы не могут использовать данный индекс:

  • db.collection.find ({propB: 'x'})
  • db.collection.find ({propC: 'y'})
  • db.collection.find ({propB: 'x', propC: 'y'})
1
him_j 2 Май 2016 в 09:20