Mongo DB подмножество запросов - PullRequest
0 голосов
/ 07 декабря 2011

В настоящее время у меня есть установка MongoDB с довольно большой базой данных (около 250 млн. Документов). В настоящее время у меня есть одна основная коллекция, в которой содержится большая часть данных, которая имеет один индекс (время). Это приводит к приемлемому времени запроса, когда только часть времени находится в части запроса (используется индекс).

Проблема в том, что когда мне нужно использовать составной ключ - временной индекс использует около 2,5 ГБ памяти, и у меня только 4 ГБ на сервере, поэтому я не хочу создавать составной ключ, поскольку все индексы умещаются в памяти и, следовательно, сильно тормозят.

Итак, мой вопрос таков: могу ли я сначала запросить время, а затем запросить это подмножество для других переменных?

Я должен указать, что я использую драйвер Ruby.

В данный момент мой запрос выглядит следующим образом (это очень медленно):

trade_stop_loss_time = ticks.find_one({
        "time" => { "$gt" => trade_time_open, "$lte" => trade_time_close },
        "bid"  => { "$lte" => stop_loss_price } 
    }).sort({"time" => 1})

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

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

Ваш запрос должен в основном отфильтровать набор кандидатов с использованием индекса time, а затем просканировать оставшиеся объекты на наличие параметра bid. Это должно быть намного эффективнее, чем сканирование на клиенте.

Вы обязательно должны запустить explain() в своем запросе, чтобы узнать, что он делает. Если он использует индекс (BtreeCursor), а количество проверенных объектов - это просто количество элементов в заданном временном интервале, это нормально. Я не думаю, что есть лучший способ, учитывая ваши ограничения. Выполнение той же операции на клиенте определенно будет медленнее.

Конечно, limit и небольшой промежуток времени помогут ускорить ваш запрос, но это могут быть внешние факторы. mongostat может также помочь найти проблему.

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

Хороший ответ можно дать только в эксперименте.

0 голосов
/ 07 декабря 2011

Вы можете вернуть результаты, используя только индекс времени, а затем отфильтровать их на стороне клиента? Кроме этого, я думаю, что вам не повезло.

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