2015-10-17 4 views
0

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

Вот пример:

db.product.createIndex({"_indexed.preventieve_mondzorg-max_bedrag_p_jr": 1}); 
db.runCommand({distinct: "product", key:"_indexed.preventieve_mondzorg-max_bedrag_p_jr"}); 

Этот запрос не будет использовать индекс, который построен на этом поле и будет идти для полного сканирования коллекции. Это то, что она производит:

{ 
    "createdCollectionAutomatically" : false, 
    "numIndexesBefore" : 50, 
    "numIndexesAfter" : 50, 
    "note" : "all indexes already exist", 
    "ok" : 1 
} 
{ 
    "values" : [ 
     "€ 250,- | 75%", 
     "Geen dekking", 
     "...", 
    ], 
    "stats" : { 
     "n" : 33660, 
     "nscanned" : 0, 
     "nscannedObjects" : 33660, 
     "timems" : 12531, 
     "planSummary" : "COLLSCAN" 
    }, 
    "ok" : 1 
} 

С другой стороны

db.product.createIndex({"free_choice.value": 1}); 
db.runCommand({distinct: "product", key:"free_choice.value"}); 

Будет ли индекс:

{ 
    "createdCollectionAutomatically" : false, 
    "numIndexesBefore" : 50, 
    "numIndexesAfter" : 50, 
    "note" : "all indexes already exist", 
    "ok" : 1 
} 
{ 
    "values" : [ 
     "gedeeltelijk", 
     "geen", 
     "ja" 
    ], 
    "stats" : { 
     "n" : 4, 
     "nscanned" : 4, 
     "nscannedObjects" : 4, 
     "timems" : 2, 
     "planSummary" : "DISTINCT { free_choice.value: 1.0 }" 
    }, 
    "ok" : 1 
} 

Итак ... что может быть разница между этими двумя областями?

Это ошибка, или я делаю что-то неправильно?

Я бегу MongoDB 3.0.6 в коробке Бродячей с Ubuntu 14.04.3 LTS

ответ

0

Видимо это ошибка ядра MongoDB. Или неправильное поведение. MongoDB не будет использовать мультикидный индекс для точечных полей для разных запросов.

Вот ответ Mongo в:

Явная оптимизация использует специальный этап доступа индекса, который возвращает различающиеся ключи индекса к родительскому стадии. Однако в многоточечном пунктирном корпусе отдельный этап должен проверить нуль или неопределенные ключи. В случае null или undefined, он должен получить полный текст , чтобы устранить неоднозначность между буквальными нулями по сравнению с null в силу недостающих полей. Мы решили удержаться, если мы видим, что пользователям это действительно нужно.

Если вы действительно хотите эту функцию, пожалуйста, голосовать за него здесь: SERVER-13298