MongoDB плохо работает на 600к объектах, альтернативная БД?оптимизация? - PullRequest
5 голосов
/ 08 марта 2011

Я начал новый проект, используя node.js и mongodb, и почти через 2 дня я собрал около 600 тыс. Объектов в MongoDB.Я уже замечаю огромное (негативное) влияние на производительность и начинаю беспокоиться, стоит ли мне переходить на другую БД так долго, как я могу, или мне следует придерживаться Mongo и проводить некоторые (дополнительные) оптимизации.

В основном я сохраняю координаты так:

[x1] => 687
[y1] => 167
[x2] => 686
[y2] => 167
[c] => 0
[s] => 0
[m] => 1299430700312
[_id] => MongoId Object (
    [$id] => 4d73bd2c82bb5926780001ec
)

Не более ... и мои запросы выглядят так:

{'$or': [ { x1: {'$gte' : 0, '$lt' : 1000 }, y1: {'$gte' : 0, '$lt' : 1000 } , { x2: {'$gte' : 0, '$lt' : 1000 }, y2: {'$gte' : 0, '$lt' : 1000 } } ] }

Я пытался установитьиндекс для каждого из полей: x1, y1, y1, y1, а также для: {x1:1,y1:1},{x2:1,y2:1}.Кроме того, я также выбрал только необходимые поля, которые мне нужны ... но, тем не менее, выполнение запроса с результирующим набором ~ 40 тыс. Строк заканчивается во время выполнения 2-8 сек.Кстати, выполнение того же запроса в PHP прервалось с сообщением «Недостаточно памяти» (256 МБ ОЗУ).

Машина представляет собой процессор Intel® Core ™ TM i7 с тактовой частотой 920 @ 2,67 ГГц и 8 ГБ ОЗУ, она не самая пыльная в стойке;)

Я действительноиссякают идеи, и я вижу миллионы и миллионы строк, приходящих на следующие недели.Как вы, наверное, заметили, строки сравнительно небольшие.Будет ли MySQL с разделением работать лучше?Любая другая NoSQL DB?

И, пожалуйста, троллинг по поводу "2-8сек не медленный" - это уже становится проблемой.Когда пара некэшированных запросов одновременно попадает на компьютер, нагрузка возрастает до 4, а к ней обращается менее 10 пользователей.

Ответы [ 2 ]

9 голосов
/ 17 марта 2011

Спасибо всем, кто нашел время подумать о моей проблеме.Предложения по использованию геопространственных индексов, кажется, являются тем ответом, который я искал.Помимо того факта, что индексы более эффективны для mongodb, способ запроса целых ящиков просто потрясающий!

Чтобы привести некоторые факты: я только начал переписывать свой код и данные сбора и начал с простого сравнения.Мои данные раньше выглядели так:


[x1] => 190
[y1] => 18
[x2] => 192
[y2] => 18
[c] => 0
[s] => 0
[b] => Array (
    [0] => 0
    [1] => 0
)
[m] => 1299365242802
[r] => 32596
[_id] => MongoId Object (
    [$id] => 4d72bd7af0528ea82f000003
)

Индексы были:


{x1:1,y1:1}, {x2:1,y2:1}

Теперь мои данные выглядят так:


[_id] => MongoId Object (
    [$id] => 4d825799b15953b90d000000
)
[coords] => Array (
    [x] => 190
    [y] => 18
)
[x2] => 192
[y2] => 18
[s] => 0
[c] => 0
[m] => 1299365242802
[r] => 32596

index:


{coords:'2D'}

Я сравнил два сценария.Первый запрос к блоку размером 400x400 пикселей из старой коллекции:



real    0m0.375s
user    0m0.348s
sys     0m0.021s


Второй сценарий использует индекс и запрашивает тот же блок, но с использованием геопространственного индекса:

real    0m0.107s
user    0m0.096s
sys     0m0.012s

Это огромная разница, и у меня есть только около 3200 объектов в моих коллекциях (каждая).Моя живая база данных / коллекция уже содержит почти 2 миллиона объектов (через 12 дней в сети).Я не могу дождаться, чтобы сравнить живые данные с этими сценариями.Это выглядит очень многообещающе для меня!:)

Спасибо всем, Stackoverflow качается!)

0 голосов
/ 09 марта 2011

Быстрый и грязный способ повысить производительность (за счет экономии памяти / пространства) будет index"x1", "x2", "y1" и "y2", но, возможно, вам следует использовать геопространственные индексы .

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