mysql - 优化mysql更新百万行

标签 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 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 计算。

创建一个包含 deviceIDseq 列的表 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/

相关文章:

node.js - 更新 Docker 镜像中的 npm

Java MySQL 更新查询

mysql - 如何在 MySQL 中对日期进行聚合计数

mysql - 缓存复杂计算的数据结果

javascript - 升级 : get() requires key and callback arguments - no Promise?

node.js - 如何使用 node.js 从 stdin 逐行流式传输并发送到客户端?

php - mysql中存在order by字符串

mysql - SQL Left Join 但不希望左表中的所有记录

javascript - 访问 Node js中对象内部的数组 - 未定义?

node.js - Locomotive.js 在调用 "locomotive.boot"时抛出错误