优化mysql更新百万行
更新1500万条记录的最佳方式是什么? 我需要将一个序列列更新为一个正常的无限制序列,该列包含的索引将变为4096,然后再次变回零 我可以像这样为每一行计算新的sequence_id,但这涉及到在很短的时间内发送1500万个更新请求优化mysql更新百万行,mysql,node.js,Mysql,Node.js,更新1500万条记录的最佳方式是什么? 我需要将一个序列列更新为一个正常的无限制序列,该列包含的索引将变为4096,然后再次变回零 我可以像这样为每一行计算新的sequence_id,但这涉及到在很短的时间内发送1500万个更新请求 db.query("SELECT * from fridgeSensors ORDER BY id ASC", (err, devices, fields) => { devices.forEach(device => {
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亿个字符的请求
这两种解决方案听起来都不正确。
你知道该怎么做吗
节点进程和mysql不在同一台服务器上这是一个快速解决方案。我不想深究顺序计算 创建一个包含deviceID和seq列的表tmp_seq,并通过一个带乘法插入的长查询进行填充,例如插入tmp_seq deviceID,seq值1,2,2,3,7,8。。。 然后执行update friedgeentries set seq=select seq from tmp_seq tmp,其中tmp.deviceID=friedgeentries.deviceID
另外,我假设DeviceID是一个键。否则,您应该使用适当的列。为什么不在应用程序中执行类似$seqNumber=$id%4096的操作呢?我的直觉是,可以执行一条update语句来管理整个集合。但即便如此,由于回滚逻辑,更新1500万条记录也需要一些时间。@ceejayoz,因为新值不是基于当前行,而是基于前一行row@VincentDuprez$seqNumber=$id%4096+1,那么?