我在 nodejs 上编写了一个函数来选择 1.5 亿条记录,处理数据并使用 UPDATE 那些相同的 1.5 亿条记录
UPDATE 'table' SET value1='somevalue' WHERE idRo2 = 1;
每一行的单一更新连接发送一个单一的查询字符串,允许在数据库连接上进行多个语句查询。
我遇到了多个错误
- 错误:连接丢失:服务器关闭了连接。
- JavaScript 堆内存不足。
- RangeError:无效的字符串长度。
- 杀死进程。
我想我可能没有使用正确的技术或编程技术
*编辑:
我需要做的数据处理是获取“wholeApiResponse”列值,解析该字符串,然后将解析后的值插入新添加的列(askPrice、lastPrice、lowPrice、highPrice、volumePrice、platformTimestamp),这最终会修改现有的通过从现有字符串中添加新值来行。
大更新(和删除)是有问题的。
计划 A:避免大更新。如果 idRo2 = 1 时 value1 应该始终为 'somevalue',则不要将其存储在表中;将其存储在其他地方并使用
JOIN
. 然后,不是检查 150M 行,而是恰好更改 1 行。计划 B:一次以 1K 行为单位进行更新。这避免了超时和许多其他潜在问题。详情:http: //mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks。即使是 10K 也会有问题,因此我推荐 1K。无论如何,超过 1K 就会进入“收益递减”。
计划 C:告诉我们真正的名称
value1
和名称。idRo2
这可能会导致一些具体的建议。数据类型的小问题。缩小表大小将有助于提高性能。
INT SIGNED
有20亿的上限。150M越来越接近了。密切关注任何AUTO_INCREMENTs
.INT
foridCurrencyPair
可能会浪费空间。(INT
占用 4 个字节;有更小的数据类型)DOUBLE
可能导致舍入错误。它需要8个字节。考虑DECIMAL(...)
。platformTimestamp DOUBLE
——啊?LONGTEXT
很少使用?我们应该讨论更好的存储方法。