2013-07-04 4 views
0

У меня есть следующий запрос:MongoDB индекс предложение

a : true AND (b : 1 OR b : 2) AND (c: null OR (c > startDate AND c <endDate)) 

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

Затем с индексом во втором поле я увидел, что предложение OR создает два отдельных запроса, а затем объединяет их при удалении дубликатов. Так что это должно быть довольно быстро и эффективно.

Последнее условие - простой диапазон дат, поэтому я думаю, что добавление поля в индекс будет хорошим вариантом.

Любое предложение по моим мыслям? благодаря

ответ

1

Этот запрос:

a : true AND (b : 1 OR b : 2) AND (c: null OR (c > startDate AND c <endDate)) 

могли бы быть переведено как:

db.collection.find({ 
    a:true, 
    b:{$in:[1,2]}, 
    $or: [ 
     {c:null}, 
     {c: {$gt: startDate, $lt: endDate}} 
    ] 
}) 

Из-за этого $or вы, скорее всего, потребуется два индекса, однако, так как $or покрывает только c то нужен только индекс на c. Так что наш первый индекс:

db.collection.ensureIndex({c:1}) 

Теперь мы не можем использовать $or с индексом соединения, так как составные индексы работают на приставкой образом и $or s оцениваются как совершенно отдельные запросы для каждого раздела, как таковой, было бы лучше использовать a,b в качестве префикса к нашему индексу здесь.

Это означает, что нужно просто индекс, чтобы покрыть другую часть вашего запроса:

db.collection.ensureIndex({b:1,a:1}) 

Положим b первого из-за булева значения a, наш индекс должен работать лучше с b первыми.

Примечание: Я не уверен относительно индекса на a вообще из-за его низкой мощности.

+0

спасибо за подробное объяснение. я просто не понимаю, почему мы игнорируем индексы в полях, которые имеют логическое значение - я думаю об этом, как о первом запросе в этом поле, он устранит около половины документов только из-за нескольких возможностей стоимости? – d1mitar

+0

@ d1mitar Эта часть субъективна тестированию, но в основном это до значений, только два из них. Из-за такой низкой мощности индекс фактически становится совершенно бесполезным, потому что он так же плох, как иметь на самом деле время от времени смотреть на большинство документов, но это зависит от тестирования, и я бы порекомендовал вам попробовать как индекс, так и индекс, и посмотреть, какие лучше. Если избирательность такова, что она мгновенно удалит около половины документов из набора результатов, тогда лучше иметь индекс, охватывающий логическое значение – Sammaye

+0

. Теперь я понимаю. Просто последний вопрос - почему индекс не может быть полем C не может быть используется в составном индексе, и он должен быть отдельным? – d1mitar