PHP 脚本要对 600 万行的 mysql 进行一次批处理操作,怎样才能用多个进程达到最快执行?

2018 年 8 月 6 日
 alwayshere

要扫描一次全表,php 对每一行都要批处理一次,如果单个 php 进程把 600 万行载入内存扫描一次全表处理实在太慢,想用多个 php 进程来扫描表:

  1. 想用多个 php 进程从 MySQL 中随机取出一些行出来,因为 primary id 不连续,但用 MySQL 的 ORDER BY RAND()慢的令人发指

  2. 想快一点也只能用两个 php 进程,一个 ORDER BY id ASC 顺序执行,一个 ORDERY BY id DESC 倒序执行,但两个进程还是太慢

估计表述得不太明白,反正就是怎样能将 mysql 快速截取成一段一段的行,让多个 php 进程去执行?

5572 次点击
所在节点    程序员
33 条回复
Sornets
2018 年 8 月 6 日
一个思路:
记录 id 取余,比如十个进程,就对 10 取余,根据余数查找对应 id,proc_id = rec_id % 10,
z550665887
2018 年 8 月 6 日
limit ?
582033
2018 年 8 月 6 日
分页
Rekkles
2018 年 8 月 6 日
PHP 哪有什么多进程 pthread 性能不会有太大的提高 这种东西如果打算用 PHP 做,mysql 和内存 能扛就能做,一次取 1k 条数据(内存够就多取点),处理 ,update,循环
lihongjie0209
2018 年 8 月 6 日
生产者消费者喽
widdy
2018 年 8 月 6 日
有这扯淡时间,一个脚本 600w 行早跑完了,为啥不一次取个 1w 条。
nsxuan
2018 年 8 月 6 日
关键是要开启事务
colincat
2018 年 8 月 6 日
@widdy 说的没毛病
newtype0092
2018 年 8 月 6 日
@widdy 那就来讨论下 6 亿条怎么做嘛,让这个淡扯的有点意义~
tanszhe
2018 年 8 月 6 日
这种简单到爆的问题 就不要来问了
mumbler
2018 年 8 月 6 日
order by id limit 1,10000
order by id limit 10001,10000
order by id limit 20001,10000
order by id limit 30001,10000
这样就可以一万一万读了,和分页一样
widdy
2018 年 8 月 6 日
@newtype0092 , 真这么大,时间来最清晰,php xxoo.php 2017-01 , php xxoo.php 2017-02 ...
ps1aniuge
2018 年 8 月 6 日
一个进程不行,就多个进程。多个进程不行就 n 机子分布。
这里面要有一个队列,分发任务或表 id。根据实际情况,一次分发一百,一千,一万。
vovov
2018 年 8 月 6 日
用队列,随便多少条都可以
GGGG430
2018 年 8 月 6 日
pcntl,我上周才刚用过,你把行数除以进程数,然后把各个起始 id 传给各个子进程,快的一比
yuanfnadi
2018 年 8 月 6 日
select * from xxx where id > 0 limit 1000
然后取最后一个 ID 为 1022
select * from xxx where id > 1022 limit 1000
想开几个线程都可以。
GGGG430
2018 年 8 月 6 日
不要排序,各个进程处理各自起始 id 部门数据,然后各个进程都每次取 100 条数据作为一个事物提交,但注意 mysql 连接数和执行脚本机器的负载
dobelee
2018 年 8 月 6 日
600w。。随便跑跑就行,等你写好算法逻辑,10 遍都跑完了。
jswh
2018 年 8 月 6 日
记得别用对象,用数组就行
InternetExplorer
2018 年 8 月 6 日
能不能直接用 sql 处理?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/477257

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX