Есть ли способ заставить mongodb хранить определенный индекс в оперативной памяти? - PullRequest
7 голосов
/ 28 марта 2012

У меня есть коллекция с относительно большим индексом (но меньше доступного для оперативной памяти), и, глядя на производительность поиска в этой коллекции и количество свободного оперативной памяти в моей системе, заданное htop, кажется, что mongo не хранит полный индекс в баран. Есть ли способ заставить монго хранить этот конкретный индекс в оперативной памяти?

Пример запроса:

> db.barrels.find({"tags":{"$all": ["avi"]}}).explain()
{
        "cursor" : "BtreeCursor tags_1",
        "nscanned" : 300393,
        "nscannedObjects" : 300393,
        "n" : 300393,
        "millis" : 55299,
        "indexBounds" : {
                "tags" : [
                        [
                                "avi",
                                "avi"
                        ]
                ]
        }
}

Не все объекты помечены тегом "avi":

> db.barrels.find().explain()
{
        "cursor" : "BasicCursor",
        "nscanned" : 823299,
        "nscannedObjects" : 823299,
        "n" : 823299,
        "millis" : 46270,
        "indexBounds" : {

        }
}

Без "$ all":

db.barrels.find({"tags": ["avi"]}).explain()
{
        "cursor" : "BtreeCursor tags_1 multi",
        "nscanned" : 300393,
        "nscannedObjects" : 300393,
        "n" : 0,
        "millis" : 43440,
        "indexBounds" : {
                "tags" : [
                        [
                                "avi",
                                "avi"
                        ],
                        [
                                [
                                        "avi"
                                ],
                                [
                                        "avi"
                                ]
                        ]
                ]
        }
}

Также это происходит, когда я ищу два или более тега (он сканирует каждый элемент, как если бы не было индекса):

> db.barrels.find({"tags":{"$all": ["avi","mp3"]}}).explain()
{
        "cursor" : "BtreeCursor tags_1",
        "nscanned" : 300393,
        "nscannedObjects" : 300393,
        "n" : 6427,
        "millis" : 53774,
        "indexBounds" : {
                "tags" : [
                        [
                                "avi",
                                "avi"
                        ]
                ]
        }
}

Ответы [ 2 ]

5 голосов
/ 28 марта 2012

Нет. MongoDB позволяет системе управлять тем, что хранится в оперативной памяти.

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

Полезные ссылки:

Кроме того, Кристина Чодоров дает этот превосходный ответ о связи между индексами MongoDB и оперативной памятью


UPDATE:

После обновления, предоставляющего вывод .explain (), я вижу следующее:

  • Запрос попадает в индекс.
  • nscanned - количество проверенных элементов (документов или индексных записей).
  • nscannedObjects - количество отсканированных документов
  • n - количество документов, соответствующих указанным критериям
  • ваш набор данных содержит 300393 записей, что представляет собой общее количество элементов в индексе и соответствующие результаты.

Возможно, я неправильно это читаю, но то, что я читаю, это то, что все элементы в вашей коллекции являются действительными результатами. Не зная ваших данных, может показаться, что каждый элемент содержит тег «avi». Другое дело, что это означает, что этот индекс почти бесполезен; индексы обеспечивают наибольшее значение, когда они работают, чтобы максимально сузить результирующее поле.

Со страницы MongoDB " Советы по индексированию и часто задаваемые вопросы ":

Понимание результатов объяснения. Есть три основных поля для поиска при проверке вывода команды объяснения:

  • курсор: значение для курсора может быть BasicCursor или BtreeCursor. Второй из них указывает, что данный запрос использует индекс.
  • nscanned: количество отсканированных документов.
  • n: количество документов возвращается по запросу. Вы хотите, чтобы значение n было близко к значение nscanned. Чего вы хотите избежать, так это сканирования коллекции, то есть, где каждый документ в коллекции доступен. Это случай, когда nscanned равно числу документов в коллекция.
  • миллисекунд: количество миллисекунд, необходимое для завершения запрос. Это значение полезно для сравнения индексированных стратегий, индексируемых неиндексированные запросы и т. д.
2 голосов
/ 28 марта 2012

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

Конечно, вы можете пройти по индексу с помощью запроса только по индексу. Это заставит MongoDB загружать каждый блок индекса. Но он должен быть «только для индекса», иначе вы также загрузите все связанные документы.

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

Однако, если есть части индекса, к которым не обращаются уже запущенные запросы, зачем это менять?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...