数据库是mysql,结果集大了,用node,最花时间的是序列化成json格式。如果只取一列有没有可以不序列化,返回数组的方法。
发布于 6 年前 作者 103777673 4422 次浏览 最后一次编辑是 5 年前 来自 问答

有个mysql表,主键id,我是读取id字段 select id from tbl. push到arrayl里。 一次全读基本假死在node-mysql里。

我现在的解决方案两个, 1、每10000条读取,处理,需要4-5秒,我400万条数据需要半个小时。后面数据库会多个表处理这事,数据量2亿条,时间上无法接受。

2、用其他工具处理缓存到redis的set中,效率高了,总觉得别扭。

3、mysql存储过程,把所有id组成字符串,返回一个条记录,节省时间。

1、2都实现了,3没做呢,休息下,逛逛论坛,提问下,看看有没有更好的选择

8 回复

每10000条处理不是更快,而是为了看到反馈信息。

存储过程行不通,29万个的时候字段超长 Error Code: 1406. Data too long for column ‘s_ids’ at row 294736 1.203 sec

难道不会只去10到20条分页吗,为什么一次取10000条呢 自豪地采用 CNodeJS ionic

10条20条不是更慢吗?分page只是为了有反馈信息可以console.log出来。避免假死状态。 主要是要解决时间消耗问题,希望缩短时间。

2亿条的结果集也够大的,查询估计也半天,就算不用node
这么大的表要考虑下是否要拆下了

在node中序列化很多數據,無論如何都會卡的。解決的辦法也很簡單,查詢的時候限制結果的數量,序列化的數據越少,速度越快啊。

至於單個node的處理時間受不了,可以多開幾個child process去解決。

再多就要考慮數據庫集羣的問題了。

用游标试试?

表,已拆开,最大的不超过1千万条,现在的解决思路是存id到redis的set里,初次装载需要几个小时,第二次直接调redis的集合。秒开。主要是解决重复数据不再消耗数据库,如果id已存在则插入,不存在则 insert ignore。

回到顶部