Как ускорить монгодб вставки?
Я пытаюсь создать приложение с большими данными, используя mongodb (кодирование на Java). Моя коллекция состоит из обычных текстовых документов. Поскольку я не хочу, чтобы дубликаты и текстовые поля документов были слишком большими для создания уникального индекса, я решил рассчитать значение контрольной суммы (MessageDigest с MD5) для текста каждого документа, сохранить это поле в документе и создать уникальный индекс для этого поле.
Примерно мой документ имеет такую структуру:
{ "_id": ObjectId('5336b4942c1a99c94275e1e6') "textval": "some long text" "checksum": "444066ed458746374238266cb9dcd20c" "some_other_field": "qwertyuıop" }
Поэтому, когда я добавляю новый документ в свою коллекцию, сначала я пытаюсь выяснить, существует ли он, находя документ с этим значением контрольной суммы. Если он существует, я обновляю его (другие поля), в противном случае я вставляю новый документ.
Эта стратегия работает! Но после миллиона документов в коллекции я начал получать недопустимую продолжительность вставки. Оба чексум поиска и вставки замедлились. Я могу вставить ~30000 документов почти за 1 час! Я читал о массовых вставках, но не мог решить, что делать с дублирующимися записями, если я пойду в этом направлении. Любые рекомендации по стратегии, чтобы ускорить процесс?
1 ответ
Я думаю, что было бы намного быстрее, если бы вы использовали другую коллекцию, содержащую только контрольную сумму и файл update_time. И когда вы вставляете ваш обычный документ JSON, вам также следует вставить этот короткий документ JSON:
Your normal JSON document:
{
"_id": ObjectId('5336b4942c1a99c94275e1e6')
"textval": "some long text"
"checksum": "444066ed458746374238266cb9dcd20c"
"update_time": new Date(1396220136948)
"some_other_field": "qwertyuıop"
}
The short JSON document:
{
"_id": ...
"checksum": "444066ed458746374238266cb9dcd20c"
"update_time": new Date(1396220136948)
}