Mongodb / Mongoid медлительность запросов по индексируемому атрибуту - PullRequest
2 голосов
/ 09 октября 2011

У меня есть модель mongoid:

class Link
  include Mongoid::Document
  include Mongoid::Timestamps
  field :url, type: String

  index :url, background: true
end

Теперь у меня есть 2 запроса с включенным профилированием:

Link.where(url: "http://stackoverflow.com/questions/ask").first  # =># <Link _id .....>

Выполнено <1ms </strong>, нетзапись для медлительности

Link.where(url: "no url").first # =># nil

Выполнено = 35 мс * PROFILER :: * Вс 9 октября 23:36:20 [conn20] запрос ccc7.linksntoreturn: 1 nscanned: 16402 reslen: 20 35ms

Мой вопрос:

Ясно, что индексация работает нормально, но почему несуществующий взял mongodb такойдолго спрашивать?даже сканирование всей коллекции монго?индексирование не заботится об этом?

Ответы [ 2 ]

3 голосов
/ 14 октября 2011

Выполнено = 35мс PROFILER :: Вс 9 октября 23:36:20 [conn20] запрос ccc7.links ntoreturn: 1 nscanned: 16402 reslen: 20 35ms

Очевидно, есть проблема. Действительно, количество сканированных документов должно быть близко (равно) количеству результатов, если вы запрашиваете только в индексированном поле.

Из документации :

nscanned Количество проверенных элементов (документов или указателей). Предметы могут быть объекты или индексные ключи. Если задействован «покрытый индекс», nscanned может быть выше, чем nscannedObjects.

Как предложено, объяснение по вашему запросу должно дать больше информации.

Можете ли вы также предоставить результат:

db.link.getIndexes()
1 голос
/ 18 октября 2011

Итак, не совсем понятно здесь.Являются ли все ваши URL уникальными вплоть до опции "без URL".

Если это так, и вы проиндексировали этот столбец в порядке возрастания, вы видите результаты алфавитного сканирования до "n".Поскольку все ваши URL начинаются с h, вы можете увидеть задержку.

Не на 100% положительно, но это возможно.

...