2011-12-22 2 views
17

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

У меня есть редкий уникальный индекс на fbId

{ 
    "ns" : "mydb.users", 
    "key" : { 
     "fbId" : 1 
    }, 
    "name" : "fbId_1", 
    "unique" : true, 
    "sparse" : true, 
    "background" : false, 
    "v" : 0 
} 

И я ожидал, что позволит мне вставлять записи с нулем в качестве fbId, но бросает дубликат ключа исключение. Это позволяет мне вставлять, если свойство fbId полностью удалено.

Разве не разрешенный индекс должен иметь дело с этим?

ответ

31

Редкие индексы не содержат документов, пропускающих индексированное поле. Однако, если поле существует и имеет значение null, оно все равно будет проиндексировано. Итак, если отсутствие поля и его равенство null выглядят одинаково для вашего приложения, и вы хотите сохранить уникальность fbId, просто не вставляйте его, пока не получите значение для него.

Вам нужны редкие индексы, если у вас большое количество документов, но только небольшая часть из них содержит какое-то поле, и вы хотите иметь возможность быстро находить документы в этом поле. Создание нормального индекса было бы слишком дорогостоящим, вы просто потратили бы драгоценную RAM на индексирующие документы, которые вам не интересны.

1

Для обеспечения максимальной производительности индексов мы можем отказаться от индексации тех документов, которые НЕ содержат поле на котором вы выполняете индекс. Для этого MongoDB имеет разреженное свойство, которое работает следующим образом:

db.addresses.ensureIndex({ "secondAddress": 1 }, { sparse: true }); 

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

Позволь мне поделиться в этой статье об основных индексах и некоторых их свойств:

геопространственных, текст, Hash индексов и уникальных и редких свойствах: http://mongodbspain.com/en/2014/02/03/mongodb-indexes-part-2-geospatial-2d-2dsphere/

1

{a:1, b:5, c:2} 
{a:8, b:15, c:7} 
{a:4, b:7} 
{a:3, b:10} 

Давайте предположим, что мы хотим создать индекс по вышеуказанным документам. Создание индекса на a & b не будет проблемой. Но что, если нам нужно создать индекс на c. Уникальное ограничение не будет работать для c ключей, потому что нулевое значение дублируется для двух документов. Решением в этом случае является использование опции sparse. Этот параметр указывает базе данных не включать документы, пропускающие ключ. Командой, вызывающей озабоченность, является db.collectionName.createIndex({thing:1}, {unique:true, sparse:true}). Редкий индекс позволяет нам использовать меньше места.

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

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