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 进程去执行?

5019 次点击
所在节点    程序员
33 条回复
xmadi
2018-08-06 18:11:39 +08:00
用 limit 效率很低 可以直接先人工查询最大的 id 和最小的 id 然后以十万个 id 间隔分组 很粗糙肯定不均匀但是没有影响 开进程池 每个进程用 where 筛选分组数据进行处理
bugsnail
2018-08-06 19:39:48 +08:00
@mumbler https://oyifan.com/2016/03/23/offsetSlow/

了解一下,limit 是会越来越慢的
singer
2018-08-06 19:47:37 +08:00
id 放到 redis 的 list,然后多进程拉起来就好了个
xschaoya
2018-08-06 21:41:24 +08:00
最简单的多进程资源分配啊,简单粗暴的就是主键分段开多进程。高级点的可以用消息队里(生产者消费者类模型)
GreatHumorist
2018-08-06 22:38:01 +08:00
还是想想直接用 sql 吧,php 弄很麻烦,上周末弄过一个三百万行的匹配,php 遍历到十万左右就很慢了。最后直接用 sql,贼快,加起来不超过 10 分钟
yangqi
2018-08-06 22:41:32 +08:00
多复杂的处理不能在 mysql 里面完成?
beastk
2018-08-06 22:45:55 +08:00
要不就用 php 执行个 go 或者 python,分分钟给你跑完
jsjscool
2018-08-06 23:46:11 +08:00
使用进程间通信也是几句代码的事情。和语言无关,通信的方式无非就是信号量,消息队列,管道这几种,都是操作系统提供的。选择一种自己能理解的方式就行了,代码都贴给你
http://blog.it2048.cn/article-php-thread/

PS:600 万行这么少的数据,几句代码就能搞定,用啥多线程。 就算用了多线程速度也提升不了多少,MySQL 的硬盘 IO 会是瓶颈。比如每秒 40M,你写入数据的极限也差不多是 40M/s。
wizardoz
2018-08-07 10:30:33 +08:00
为啥要用 php 处理?不是放进数据库用 SQL 处理最快吗?
allgy
2018-08-07 10:54:46 +08:00
@jsjscool @alwayshere php 的线程就是个废物不建议使用,大数据量用存储过程就行
slince
2018-08-07 12:33:32 +08:00
这种问题应该要你们的 dba,为啥要程序员自己写脚本去解决
batter
2018-08-07 14:30:58 +08:00
说 limit 的,你是来搞笑的么,,,,,对于超大数据来说,limit 效率非常的低,既然按照 id 处理,按照 id>$id 应该会好点吧
abccccabc
2018-08-07 14:55:33 +08:00
楼主,你还没有执行吗?队列呀,14 楼,23 楼都说了。

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

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

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

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

© 2021 V2EX