Оптимизация MongoDB - PullRequest
       4

Оптимизация MongoDB

1 голос
/ 27 июня 2011

У меня около 105 миллионов записей, подобных этой:

{
  "post_id": 1314131221,
  "date": 1309187001,
  "upvotes": 2342
}

в коллекции MongoDB.У меня также есть индекс "post_id" и "date".

Тогда мне нужно сделать это:

db.fb_pages_fans.find({
    post_id: 1314131221,
    date: {"$gt": 1309117001, "$lta": 1309187001}
}).sort({date: 1});

Если я установлю "date" на конкретную дату:

  • , когда он возвращает 30 записей, потребовалось ~ 130 мс
  • , когда он возвращает 90 записей, потребовалось ~ 700 мс
  • , когда он вернул 180 записей, это заняло ~ 1200 мс

Конечно, я говорю о первом запросе, второй и более запросы очень быстрые, но мне нужно, чтобы первые запросы были быстрыми.

Это намного медленнее из 90 записей, чем PostgreSQL,который я использую сейчас.Почему это так медленно?

кстати.создание индекса для упомянутых двух «столбцов» на 105-миллиметровых записях заняло около 24 часа .

. Это выполняется на одной машине с 12 ГБ ОЗУ, вот журнал от mongostats, когда я выполнял запрос:

insert  query update delete getmore command flushes mapped  vsize    res faults locked % idx miss %     qr|qw   ar|aw  netIn netOut  conn       time
     0      0      0      0       0       1       0  23.9g  24.1g     8m      0        0          0       0|0     0|0    62b     1k     1   18:34:04
     0      1      0      0       0       1       0  23.9g  24.1g     8m     21        0          0       0|0     0|0   215b     3k     1   18:34:05

1 Ответ

1 голос
/ 27 июня 2011

Если ваш первый запрос медленный и все последовательные, аналогичные запросы выполняются быстро, то mongo перемещает запрошенные данные с диска в память. Это относительно трудно избежать с наборами данных такого размера. Используйте mongostat и проверьте статистику сбоев, чтобы увидеть, получаете ли вы сбои страниц во время ваших запросов. В качестве альтернативы может оказаться, что ваши индексы не помещаются в память, и в этом случае вы можете попытаться сбалансировать их так, чтобы соответствующие части с высокой пропускной способностью постоянно находились в физической памяти.

Кроме того, мы говорим об одной физической базе данных или обособленной установке?

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