更新 1500 万条记录的最佳方式是什么? 我需要更新一个序列列,其中包含的索引从 4096 开始,然后再次回到零,成为正常的无限序列。
我可以像这样计算每一行的新sequence_id,但这涉及阳极脚本在很短的时间内发送1500万个更新请求。
db.query("SELECT * from fridgeSensors ORDER BY id ASC", (err, devices, fields) =>
{
devices.forEach(device =>
{
db.query("SELECT * from fridgeEntries WHERE deviceID = '?' ORDER BY id ASC",[device.deviceID], (err, entries, fields) =>
{
var prev_seq = 0;
entries.forEach(entry =>
{
var seq = entry.seqNumber || 0;
seq = (Math.floor(prev_seq/4096)*4096)+seq;
if(seq < prev_seq) seq += 4096;
db.query("UPDATE `fridgeEntries` SET `seqNumber`= ? WHERE `id`= ?;",[seq,entry.id]);
prev_seq = sec;
});
});
});
});
我正在考虑发送一个插入..重复更新,其中包含列和 id 主键的所有新值,但这意味着发送一个很长的请求,考虑到请求中每行大约有 20 个字符
('xxxxxxx','xxxxxxx')
这意味着一个包含 3 亿个字符的请求...
这两种解决方案听起来都不正确。 知道这应该如何完成吗?
node进程和mysql不在同一台服务器
最佳答案
这是一个快速的解决方案。我不想深入研究 seq 计算。
创建一个包含 deviceID
和 seq
列的表 tmp_seq
,并通过一个长查询和多次插入来填充它,例如 insert into tmp_seq (deviceId, seq) 值 (1,2),(2,3),(7,8), ...
然后执行update freezeEntries set seq = (select seq from tmp_seq tmp where tmp.deviceID =冰箱Entries.deviceID)
。
附注我假设 DeviceID
是一个 key 。否则,您应该使用适当的列。
关于mysql - 优化mysql更新百万行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58560137/