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

2018-08-06 14:10:34 +08:00
 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 进程去执行?

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

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

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

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

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

© 2021 V2EX