2013-07-11 2 views
1

У меня есть коллекция mongo db для ресторанов. , например. {_id: uniquemongoid, Оценка: 3, город: «Berlin» }Индексы для mongodb

  1. Рестораны перечислены города и упорядочены по рангу (целое число) - я должен создать индекс по городу и ранга, или город/ранг? (Я запрашиваю по городу и сортирую по рангу)

  2. Кроме того, существует несколько полей с булевыми элементами, например. {hasParking: true, familyFriendly: true} - следует ли создавать индексы для ускорения запросов для этих фильтров? составные индексы? Для меня это не ясно, если я должен создавать составные индексы, так как запросы могут иметь только один логический набор или более булево значение.

+0

Все зависит от того, сколько данных у вас есть и какие у вас есть вопросы. – Thilo

+0

Обратите внимание, что вы можете использовать метод '' explain() 'cursor) (http://docs.mongodb.org/manual/reference/method/cursor.explain/), чтобы проверить, какой индекс использовался для выполнения запроса. Поэтому, когда вы не уверены, помогает ли данный индекс конкретному запросу, вы можете попробовать его и проверить. – Philipp

+0

Моя коллега поговорила об этом: http://www.youtube.com/watch?v=AVNjqgf7zNw Он использует mysql в качестве примера, но применяются те же принципы. Возможно, это поможет вам разработать свои индексы. – leif

ответ

1

1) создать индекс {restaurant: 1, rank: 1}, который будет служить вашей цели.

Вы избежите 2 индексов

2) Создать документ в формате, и вы можете запросить любой не из полей, которые вы хотите.

{ 
    info: [{hasParking:true}, {familyFriendly:true}], 
    _id: 
    rank: 
    city: 
} 
db.restaurants.ensureIndex({info : 1}); 
db.restaurants.find({ info :{ hasParking:true}}) 
  • Примечание MongoDB не используют два индекса для одного запроса (кроме $ или запросов). Итак, в случае (2), если вы хотите добавить фильтр добавления по запросу (1), этот параметр (2) не будет работать. Я не уверен в вашем (2) требовании, поэтому отправляю это решение.
+0

запросы будут иметь город, ранг, булев, я должен создать индекс со всеми из них? У меня больше запросов с только городом, ранг должен ли я создать 2 индекса? – LukeSolar

+0

Я не буду рекомендовать вас для '{city: 1, rank: -1, info: 1}', потому что размер индекса будет огромным. Также я сомневаюсь, что этот индекс можно эффективно использовать для получения отсортированных данных результата (проверьте 'scanAndOrder' в' explain() ').Что касается второго запроса, если я правильно понял, это не сработает, потому что mongo никогда не будет использовать два индекса для одного запроса, то есть '{info: 1}' и '{city: 1, rank: -1}' Если вы в порядке с размером индекса, вы можете пойти с первым подходом. –

+0

У меня есть около 10 тыс. Ресторанов, и я думаю, что сейчас я пойду с первым подходом. но поскольку у нас есть частые обновления (до ранга), это может стать проблемой (помимо размера индекса), правильно? – LukeSolar

3

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

Как для предложенных индексов:

  1. Вам потребуется составной индекс города/ранг. Индексы в MongoDB могут использоваться только слева направо (на данный момент) и, следовательно, выполнять поиск по равенству в «городе», а затем сортировка результата по «ранге» означает, что индекс { city: 1, rank: -1 } будет работать лучше всего.

  2. Индексы на булевых полях часто не очень полезны, так как в среднем MongoDB по-прежнему необходимо получить доступ к половине ваших документов. Сделав выбор по городу (и, надеюсь, предел!), Сделав дополнительный фильтр для hasParking и т. Д., Будет не сделать MongoDB использовать как city/rank, так и индекс hasParking. MongoDB может использовать только один индекс для каждого запроса.

+0

для 2) согласны ли вы с Абхишеком Кумаром создать поле, содержащее все булевы, и создать на нем индекс? – LukeSolar

+0

Нет, поскольку количество элементов индекса по-прежнему будет очень низким. – Derick