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
a> и сравните результаты 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