PHP 写代码直接处理 MySQL 中的大量数据,卡死

2015-05-11 09:27:10 +08:00
 Nixus

有时候需要独立处理数据库中的大量数据,这个时候就自己写代码去处理,但是执行的时候,很耗资源,这个一执行,基本上网站的其它功能就全都卡在那里,动不了了,大家有什么好的解决方案吗?

实际情况是这样的,公司A系统中,有电话录音文件,这些录音文件,需要和B系统中的用户关联起来,所以,录音文件的文件名中包含了用户的电话号码,通过电话号码,在B系统中的数据库查找顾客ID,然后关联,大概有十几万条通话记录吧。PHP写了一段代码来处理,但是一执行,就系统的其它功能就卡住了,动不了

有什么好的解决方案?

3858 次点击
所在节点    PHP
24 条回复
kasp
2015-05-11 09:33:28 +08:00
1.
可以使用sleep 减少数据库压力
每执行一次插入让进程休眠1秒
2.
将执行语句拼接成sql,一次性(或分段)插入。
linescape
2015-05-11 09:36:23 +08:00
不理解你说的关联是什么操作,既然B中已有电话号码字段,而文件名刚好使用了电话号码,则可以直接通过电话号找到录音,还需要关联什么。。。
czheo
2015-05-11 09:36:28 +08:00
设置replication到一台slave上,php对slave操作
stiekel
2015-05-11 09:42:11 +08:00
两点,一点是上面 @czheo 说的主从,另外就是每次少处理点,然后定时隔一段时间执行一次,比如写到crontab里,每分钟执行一次。
ywisax
2015-05-11 10:03:58 +08:00
一是上面提到的做db的主从
二是优化这部分的代码逻辑,例如可以将耗时的操作放到cli跑。
yangqi
2015-05-11 10:06:17 +08:00
先搞清楚是php的问题还是mysql数据库没优化好,你直接在mysql里操作卡么?
jarlyyn
2015-05-11 10:07:23 +08:00
快照一下,把数据库备份到其他服务器,再处理。
imt
2015-05-11 10:08:32 +08:00
可以用命令行的方式执行..卡死可能是因为请求时间太长?
yangqi
2015-05-11 10:09:16 +08:00
十几万数据量不大,应该是数据库没优化好,电话号码是不是存成字符串varchar了?
msg7086
2015-05-11 10:10:08 +08:00
通过号码找ID,注意下索引……
neilwong
2015-05-11 10:27:46 +08:00
感觉是你关联的算法有问题
fengyqf
2015-05-11 10:30:58 +08:00
0 优化算法
1 优化数据库,如索引等
2 复制数据到新库,处理后再还原回去
tigerstudent
2015-05-11 10:37:50 +08:00
一楼真是让我大开眼界
aksoft
2015-05-11 10:56:09 +08:00
...这 128内存吧?我的30多万的数据操作,网站也不卡..
coosir
2015-05-11 11:25:56 +08:00
这点数据量没必要搞快照吧。
问题应该在于你php是怎么实现的,敢不敢贴代码?
Nixus
2015-05-11 11:34:06 +08:00
跟朋友讨论的时候,然后突然想到,录音文件中是包含了录音时间的,同时每条录音,都有相应的服务信息提交到系统中,那么就可以先收集这些录音文件的时间,然后排序,取出时间段,再根据这个时间段,去读这段时间内相应的服务记录的user_id,关联读取电话号码,然后再进行文件操作,这样就可以大大降低访问数据库的频率
这样或许才是正确的思路吧
likuku
2015-05-11 11:56:47 +08:00
难道露珠直接将录音的音频文件存mysql了?
feiyuanqiu
2015-05-11 12:43:24 +08:00
应该是 MySQL 卡住了。
之前做过类似的功能,公司的跟单人员的电话录音软件是买的,保存的录音数据只有拨出号码,呼叫号码,通话开始时间、结束时间等

然后要把录音跟具体的跟单人关联上,因为我们规定的跟单人必须要在跟客户交流后记录一条日志,就用的日志的记录时间和客户号码与录音的时间和号码去匹配,执行的流程大概是这样的:
1、脚本取出过去一段时间(这个值是设置的)所有还没有跟跟单人匹配的录音
2、脚本取出过去一段时间(这个值是设置的)所有还没有绑定录音的跟单日志
3、把录音弄成按号码为 index 的关联数组(每个号码的数据量就比较少了),循环跟单日志,按照每个日志的客户号码去匹配录音,匹配到的录音数据就 unset 掉
4、最后把数据一次性存入表,切忌循环操作数据库,匹配的录音更新匹配状态

功能很简单,就是做的时候很蛋疼,我一般是想要很精确的那种匹配,但是因为跟单日志是跟单人员自己弄的,里面的时间不可能准确,所以匹配录音和日志的时候就用了一个时间段,所有落到这个时间段的同一个号码的录音都认为是跟单人员跟客户交流的
lincanbin
2015-05-11 12:47:15 +08:00
就我一个人觉得楼主是把所有数据全部拿到PHP里,然后用PHP查找么?
Lucups
2015-05-11 13:07:02 +08:00
1. 对号码做索引 或者 根据 号码查 录音文件,十几万条数据量并不大,遍历一次就OK了
2. 如果只是一次性处理,拿到本地跑就行了

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

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

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

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

© 2021 V2EX