Запрос на 10 миллионов документов mongodb

Я храню метаданные книги, такие как имя, авторы, цена, издатель и т.д. в документе mongodb. У меня около 10 миллионов этих документов, и все они находятся в одной коллекции. Средний размер документа - 1,9 КБ. Теперь у меня есть индексы на name, authors и price. На самом деле у меня есть 2 индекса по цене один в порядке возрастания и один убывающий. Моя версия mongodb - 2.2.0, и я использую драйвер php для запроса манго. Версия драйвера 1.12. Но когда я делаю запрос диапазона по цене, я получаю MongoCursorTimeoutException. В моем запросе я пытаюсь найти книги в определенном ценовом диапазоне, например "цена менее 1000 и более 500".

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

ИЗМЕНИТЬ На самом деле мой индекс цен является сложным. У меня есть поле состояния, которое имеет целочисленное значение, поэтому мой индекс цен выглядит как {price:-1,status:1} и {price:1,status:1} Также я пытаюсь получить 20 документов за раз с PHP.

Ответ 1

Как сказал @JohnyHK, моя оперативная память была слишком низкой. Таким образом, он увеличился до 12 ГБ, и теперь он работает. Спасибо всем за их комментарии и ответы

Ответ 2

У нас был большой опыт работы с коллекциями Mongo с миллионами документов с использованием как одиночных, так и общих серверов и выделенных наборов реплик на EC2 с использованием как традиционных, так и SSD-томов EBS. Рабочие нагрузки разнообразны: некоторые из них ориентированы на аналитику, а другие поддерживают веб-запросы. Вот путь анализа основных причин, который я бы рекомендовал:

  • Запустите свои запросы с помощью .explain(), чтобы узнать, что происходит с точки зрения используемых индексов и т.д. При необходимости отредактируйте индексы. Оптимизатор Mongo довольно наивен, поэтому, если ваши индексы не соответствуют шаблону запроса, они могут быть пропущены.

  • Проверьте MMS и найдите любую из следующих проблем: (1) не все данные в памяти (обозначенные ошибками страницы) и (2) ) длины очереди (обычно указывая на некоторый тип узкого места). Производительность Mongo быстро ухудшается, когда не все данные хранятся в памяти, потому что в базе данных есть один глобальный замок и трогательная память, особенно в облаке - плохая новость. Недавно мы обновили до облачного хранилища SSD, и мы видим 3-10-кратное повышение производительности в базе данных размером около 1/2 ТБ.

  • Увеличьте уровень профилирования до 2 (максимальный), запустите некоторое время и посмотрите на журнал операций. См. профилировщик MongoDB.

Надеюсь, что это поможет.

Ответ 3

  • Проверьте свои нерешительности. Переиндексируйте свои данные и убедитесь, что коллекция полностью проиндексирована перед запуском запросов. (10 миль. Docs могут занять некоторое время для индексации)
  • Самая медленная часть любого проиндексированного запроса - это фактическое извлечение документа. Я мог представить, что в зависимости от количества документов, которые вы тянете, это может занять 30 секунд или больше и много памяти.

Для получения более полезных инструкций о некоторых вещах вы можете попробовать проверить эту страницу: http://www.mongodb.org/display/DOCS/Optimization

За 10 миль. вы также можете подумать о том, чтобы очертить данные на компьютерах. Помните, что чтение на жестком диске происходит медленнее, чем циклы процессора.