MongoDB: Массовая вставка (Bulk.insert) vs insert multiple (insert ([...]))
Есть ли разница между объемной вставкой vs вставка нескольких документов?
var bulk = db.items.initializeUnorderedBulkOp();
bulk.insert( { item: "abc123", defaultQty: 100, status: "A", points: 100 } );
bulk.insert( { item: "ijk123", defaultQty: 200, status: "A", points: 200 } );
bulk.insert( { item: "mop123", defaultQty: 0, status: "P", points: 0 } );
bulk.execute();
VS
db.collection.insert(
<document or array of documents>
)
Есть ли это быстрее?
Ответы
Ответ 1
@Dummy верна, что массовые операции, как правило, быстрее, чем отдельные вставки, однако, начиная с версии 2.6 и выше, вставка нескольких документов с использованием collection.insert
- это просто синтаксический сахар для BulkWrite
. Если вы установите флаг ordered
равным false, производительность должна быть идентичной неупорядоченной объемной вставке:
db.collection.insert(<document array>,{ordered:false})
Эта операция вернет BulkWriteResult
, подробнее см. в документации .
Ответ 2
Да, есть разница. При использовании массивных опций (всегда) вам нужно только один раз войти в базу данных и выполнить операцию по партиям записей, после чего вы вернетесь в приложение. С отдельными вставками вам нужно будет перейти в базу данных, вставить, а затем вернуться к приложению, и вы повторите этот процесс для каждой отдельной операции вставки, которую вы укажете базе данных. Таким образом, отдельные вставки очень медленные по сравнению с массовыми операциями. Это похоже на покупки в бакалейных магазинах, если у вас есть все, что вам нужно для покупки, вы можете купить их в одной поездке (объемная вставка), но если для каждого элемента вам нужно доехать до магазина, чтобы получить его, а затем проехать домой, затем вернитесь в магазин, чтобы купить другой товар, тогда он не очень эффективен (например, отдельные вставки)
Примечание. Несмотря на то, что при взаимодействии с MongoDB с использованием оболочки вам нужно иметь дело только с одной функцией insert
для массовых и отдельных вставок, вы должны провести различие между операциями insertOne()
и insertMany()
при использовании API-интерфейсы драйвера MongoDB. И вы никогда не должны называть insertOne()
внутри цикла (причина: см. Мою аналогию с покупками в продуктах выше).