有时候需要独立处理数据库中的大量数据,这个时候就自己写代码去处理,但是执行的时候,很耗资源,这个一执行,基本上网站的其它功能就全都卡在那里,动不了了,大家有什么好的解决方案吗?
实际情况是这样的,公司A系统中,有电话录音文件,这些录音文件,需要和B系统中的用户关联起来,所以,录音文件的文件名中包含了用户的电话号码,通过电话号码,在B系统中的数据库查找顾客ID,然后关联,大概有十几万条通话记录吧。PHP写了一段代码来处理,但是一执行,就系统的其它功能就卡住了,动不了
有什么好的解决方案?
1
kasp 2015-05-11 09:33:28 +08:00
1.
可以使用sleep 减少数据库压力 每执行一次插入让进程休眠1秒 2. 将执行语句拼接成sql,一次性(或分段)插入。 |
2
linescape 2015-05-11 09:36:23 +08:00
不理解你说的关联是什么操作,既然B中已有电话号码字段,而文件名刚好使用了电话号码,则可以直接通过电话号找到录音,还需要关联什么。。。
|
3
czheo 2015-05-11 09:36:28 +08:00
设置replication到一台slave上,php对slave操作
|
4
stiekel 2015-05-11 09:42:11 +08:00
两点,一点是上面 @czheo 说的主从,另外就是每次少处理点,然后定时隔一段时间执行一次,比如写到crontab里,每分钟执行一次。
|
5
ywisax 2015-05-11 10:03:58 +08:00
一是上面提到的做db的主从
二是优化这部分的代码逻辑,例如可以将耗时的操作放到cli跑。 |
6
yangqi 2015-05-11 10:06:17 +08:00
先搞清楚是php的问题还是mysql数据库没优化好,你直接在mysql里操作卡么?
|
7
jarlyyn 2015-05-11 10:07:23 +08:00
快照一下,把数据库备份到其他服务器,再处理。
|
8
imt 2015-05-11 10:08:32 +08:00
可以用命令行的方式执行..卡死可能是因为请求时间太长?
|
9
yangqi 2015-05-11 10:09:16 +08:00
十几万数据量不大,应该是数据库没优化好,电话号码是不是存成字符串varchar了?
|
10
msg7086 2015-05-11 10:10:08 +08:00
通过号码找ID,注意下索引……
|
11
neilwong 2015-05-11 10:27:46 +08:00
感觉是你关联的算法有问题
|
12
fengyqf 2015-05-11 10:30:58 +08:00
0 优化算法
1 优化数据库,如索引等 2 复制数据到新库,处理后再还原回去 |
13
tigerstudent 2015-05-11 10:37:50 +08:00
一楼真是让我大开眼界
|
14
aksoft 2015-05-11 10:56:09 +08:00
...这 128内存吧?我的30多万的数据操作,网站也不卡..
|
15
coosir 2015-05-11 11:25:56 +08:00
这点数据量没必要搞快照吧。
问题应该在于你php是怎么实现的,敢不敢贴代码? |
16
Nixus OP 跟朋友讨论的时候,然后突然想到,录音文件中是包含了录音时间的,同时每条录音,都有相应的服务信息提交到系统中,那么就可以先收集这些录音文件的时间,然后排序,取出时间段,再根据这个时间段,去读这段时间内相应的服务记录的user_id,关联读取电话号码,然后再进行文件操作,这样就可以大大降低访问数据库的频率
这样或许才是正确的思路吧 |
17
likuku 2015-05-11 11:56:47 +08:00
难道露珠直接将录音的音频文件存mysql了?
|
18
feiyuanqiu 2015-05-11 12:43:24 +08:00
应该是 MySQL 卡住了。
之前做过类似的功能,公司的跟单人员的电话录音软件是买的,保存的录音数据只有拨出号码,呼叫号码,通话开始时间、结束时间等 然后要把录音跟具体的跟单人关联上,因为我们规定的跟单人必须要在跟客户交流后记录一条日志,就用的日志的记录时间和客户号码与录音的时间和号码去匹配,执行的流程大概是这样的: 1、脚本取出过去一段时间(这个值是设置的)所有还没有跟跟单人匹配的录音 2、脚本取出过去一段时间(这个值是设置的)所有还没有绑定录音的跟单日志 3、把录音弄成按号码为 index 的关联数组(每个号码的数据量就比较少了),循环跟单日志,按照每个日志的客户号码去匹配录音,匹配到的录音数据就 unset 掉 4、最后把数据一次性存入表,切忌循环操作数据库,匹配的录音更新匹配状态 功能很简单,就是做的时候很蛋疼,我一般是想要很精确的那种匹配,但是因为跟单日志是跟单人员自己弄的,里面的时间不可能准确,所以匹配录音和日志的时候就用了一个时间段,所有落到这个时间段的同一个号码的录音都认为是跟单人员跟客户交流的 |
19
lincanbin 2015-05-11 12:47:15 +08:00
就我一个人觉得楼主是把所有数据全部拿到PHP里,然后用PHP查找么?
|
20
Lucups 2015-05-11 13:07:02 +08:00
1. 对号码做索引 或者 根据 号码查 录音文件,十几万条数据量并不大,遍历一次就OK了
2. 如果只是一次性处理,拿到本地跑就行了 |
21
yanze0613 2015-05-11 13:23:09 +08:00
读写分离,或者定期作业
|
22
knightlhs 2015-05-11 15:01:46 +08:00
1、要做读写分离 否则 容易遇到锁
2、按需增加索引 加快扫描速度 3、整理业务 可以合并的合并成一条 sql 不能合并 且量大的情况下 启用队列 4、实时性不高的业务 做成定时任务 在负载低的时段后端以 cli 方式运行 |
23
fangjinmin 2015-05-11 18:21:20 +08:00
10多万条数据不多,每次取少一点数据,用offset limit来取吧,这样会快一些。
|
24
akira 2015-05-12 01:02:15 +08:00
这种一般是sql没优化好的可能性比较大。。
|