Подтвердить что ты не робот

Оптимизация индекса mongodb (обратная)

У меня есть коллекция mongodb, "features", имеющая 3 поля: имя, активный, вес. Я сортирую функции по убыванию:

db.features.find({active:true},{name:1, weight:1}).sort({weight:-1})

для оптимизации, я создаю для него индекс:

db.features.ensureIndex({'active': 1, 'weight': -1})

Я вижу, что он хорошо работает при использовании explain() в запросе.

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

db.features.find({active:true},{name:1, weight:1}).sort({weight:1}).explain()

когда я использую объяснение(), чтобы показать, как работает индекс, я нахожу его печатным:

"cursor" : "BtreeCursor active_1_weight_-1 reverse",

означает, что индекс обратный означает, что запрос оптимизирован индексом?

Как правило, мне нужно создать 2 индекса, например, по возрастанию по весу и по убыванию по весу, если я отсортирую его по весу в любом случае и спустившись в других случаях?

4b9b3361

Ответ 1

Как вы можете видеть из этого документа когда explain() выводит BtreeCursor, это означает, что использовался индекс. Когда используется индекс, indexBounds будет установлен для указания границ ключа для сканирования в индексе. Однако, если putput показал BasicCursor, это указывает на стиль стиля сканирования таблицы.

Итак, исходя из того, что вы сказали, из результатов explain() вы можете видеть, что используете BTree Cursor в индексе с именем active_1_weight_-1, а reverse означает, что вы выполняете итерацию индекс в обратном порядке.

Нет, вам не нужно создавать отдельные индексы.

Ответ 2

Я знаю, что опаздываю, но хотел бы добавить немного более подробную информацию. Когда вы используете explain(), и он выводит курсор: BtreeCursor, он не всегда гарантирует, что для удовлетворения вашего запроса используется только индекс. Вы также должны проверить опцию "indexOnly" в результатах объяснения(). Если indexOnly выводится как true, это означает, что ваш запрос был удовлетворен только с использованием индекса, а документы в коллекции вообще не упоминались. Это называется "охватываемый индексный запрос" http://docs.mongodb.org/manual/applications/indexes/

Но если результаты объяснения - это курсор: BtreeCursor и indexOnly: false, это означает, что помимо использования индекса также упоминалась коллекция. В вашем случае для запроса:

    db.features.find({active:true},{name:1, weight:1}).sort({weight:1}).explain()

Mongo использовал бы индекс 'active': 1, 'weight': -1, чтобы удовлетворить начальную часть запроса, т.е. db.features.find({active: true}) и выполнил бы сортировку без использования индекс. Поэтому, чтобы точно знать, вы должны посмотреть на результат indexOnly внутри explain().

Ответ 3

Это очень запутанно. в классе mongodb приведен пример, приведенный ниже.

уведомление BtreeCursor reverse используется ТОЛЬКО для целей сортировки в команде пропуска и ограничения

НЕ для определения местоположения записи.

урок: если nscan = 40k и n = 10 означает, что индекс btree не используется для определения местоположения записи.

, поэтому, когда u видит, что индекс обратного индекса btreecursor не нужен, средний индекс будет использоваться для определения местоположения reocrd.

Предположим, у вас есть коллекция, называемая твитами, чьи документы содержат информацию о времени создания твита и пользовательском followers_count в то время, когда они выдали твит. Что вы можете сделать из следующего объяснения вывода? db.tweets.find({ "user.followers_count": {$ gt: 1000}}). sort ({ "created_at": 1}). limit (10).skip(5000).explain() {        "курсор": "BtreeCursor created_at_-1 reverse",        "isMultiKey": false,        "n": 10,        "nscannedObjects": 46462,        "nscanned": 46462,        "nscannedObjectsAllPlans": 49763,        "nscannedAllPlans": 49763,        "scanAndOrder": false,        "indexOnly": false,        "nYields": 0,        "nChunkSkips": 0,        "миллис": 205,        "indexBounds": {                "создан в": [                       [                               {                                        "$ minElement": 1                               },                               {                                        "$ maxElement": 1                               }                       ]               ]       },        "server": "localhost.localdomain: 27017" }  Этот запрос выполняет проверку коллекции. да  Запрос использует индекс для определения порядка возврата документов результатов. да  Запрос использует индекс, чтобы определить, какие документы совпадают. нет  Запрос возвращает 46462 документов no

Ответ 4

Предполагая, что вы используете 2.0+, обратный обход не является более дорогостоящим для MongoDB, поэтому для этого случая вам не нужно создавать отдельные индексы для сортировки вперед/назад. Вы можете подтвердить, создав его и используя hint(), если хотите (оптимизатор будет кэшировать текущий индекс на некоторое время, поэтому автоматически не будет выбирать другой индекс).