【发布时间】:2023-03-22 03:32:01
【问题描述】:
我对性能问题有些担心。我有一个每分钟运行一次的 cron,它会更新一个集合。
每分钟从外部 API 获取 10,000 笔新交易。其中一些交易记录已经在我的数据库中。
for (transaction in transactions) {
if (Transaction.findOne(_id: transactionId, { _id: 1}))
console.log("Already in db");
else
Transaction.insert(transaction)
为了加快速度,我将整个集合加载到内存中,并且只插入到我的脚本末尾。
const toInsert = [];
const transactions = await Transaction.find().select(_id);
// I transform array of transactions to an object of transaction where key is _id, thus i can avoid using a find at every iteration
const transactionsObject = transactions.reduce((obj, transaction) => {
obj[transaction.id] = true;
return obj;
}, {})
for (transaction in transactions) {
if (transactionsObject[transactionId])
console.log("Already in db");
else {
toInsert.push(transaction);
transactionsObject[transaction._id] = true;
}
Transaction.insertMany(toInsert);
使用我的脚本的这个版本,脚本非常快,但我对可伸缩性有些担心,因为我需要大量内存,如果我需要线程化,我需要在线程之间共享所有内容。
您将如何优化脚本?
【问题讨论】:
-
交易是指“货币交易”而不是 ACID 交易,对吧? (这就是它的样子——我只是想澄清一下)
-
我的意思是货币交易是的
-
“集合”在哪里(在“加载到内存”之前)?
标签: arrays mongodb performance optimization find