как работает совместный индекс в mongodb?


person halostack    schedule 04.11.2012    source источник


Ответы (1)


1. Но я хочу знать, когда мы создаем совместный индекс для «a» и «b», как он работает по сравнению с простым индексом?

MongoDB использует только один индекс для каждого запроса... поэтому, если ваши критерии find() включают значения как a, так и b, вам следует добавить составной индекс для эффективного поиска по обоим полям.

2. И почему мы получим выгоду, просто найдя «а», но если мы найдем «б», мы не получим от этого никакой выгоды? будет ли совместный индекс таким же, как объединение «a» и «b», поэтому мы получим от него выгоду для префикса?

MongoDB использует индексы B-дерева, поэтому вы можете эффективно сопоставлять частичные ключи только с помощью префикса. Чтобы найти все возможные значения, соответствующие суффиксу или подстроке, необходимо проверить все элементы индекса.

Настройте тестовые данные для сравнения

Примеры ниже используют оболочку mongo:

/* Generate some test data */
for (i = 0; i< 1000; i++) {
    db.mycoll.insert({a:i})
    db.mycoll.insert({b:i})
    db.mycoll.insert({a:i,b:i})
}

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

/* Add simple and compound index */
db.mycoll.ensureIndex({a:1})
db.mycoll.ensureIndex({b:1})
db.mycoll.ensureIndex({a:1, b:1})

Наконец, для приведенных ниже тестовых сценариев заставьте ваш запрос использовать определенный индекс с $hint и сравните результаты explain().

Найдите b, используя простой индекс

Поиск b с использованием простого индекса b может найти совпадающие записи непосредственно в индексе. Он просматривает 4 записи индекса (nscanned), чтобы вернуть 4 результата (n):

db.mycoll.find({b:10}).hint({b:1}).explain()
{
    "cursor" : "BtreeCursor b_1",
    "n" : 4,
    "nscannedObjects" : 4,
    "nscanned" : 4,
    ...
}

Поиск b по составному индексу (a,b)

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

Таким образом, чтобы найти совпадающие записи непосредственно в индексе... он сканирует 1904 записей индекса (nscanned) и возвращает 4 результата (n):

db.mycoll.find({b:10}).hint({a:1,b:1}).explain()
{
    "cursor" : "BtreeCursor a_1_b_1",
    "n" : 4,
    "nscannedObjects" : 4,
    "nscanned" : 1904,
    ...
}

Технически сканирование 1904 документов меньше, чем 3000 документов в моей тестовой коллекции... но это далеко не оптимально.

Найдите a, используя составной индекс (a,b)

Для сравнения, поиск a с использованием составного индекса показывает, что нужно отсканировать только 4 значения, чтобы получить 4 документа:

db.mycoll.find({a:10}).hint({a:1,b:1}).explain()
{
    "cursor" : "BtreeCursor a_1_b_1",
    "n" : 4,
    "nscannedObjects" : 4,
    "nscanned" : 4,
    "nscannedObjectsAllPlans" : 4,
    ...
}

Для получения дополнительных примеров и пояснений я бы рекомендовал прочитать статью Оптимизация составных индексов MongoDB .

person Stennie    schedule 04.11.2012