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

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

  •  
  •   Nixus May 11, 2015 4342 views
    This topic created in 4020 days ago, the information mentioned may be changed or developed.

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

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

    有什么好的解决方案?

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

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

    功能很简单,就是做的时候很蛋疼,我一般是想要很精确的那种匹配,但是因为跟单日志是跟单人员自己弄的,里面的时间不可能准确,所以匹配录音和日志的时候就用了一个时间段,所有落到这个时间段的同一个号码的录音都认为是跟单人员跟客户交流的
    lincanbin
        19
    lincanbin  
       May 11, 2015
    就我一个人觉得楼主是把所有数据全部拿到PHP里,然后用PHP查找么?
    Lucups
        20
    Lucups  
       May 11, 2015
    1. 对号码做索引 或者 根据 号码查 录音文件,十几万条数据量并不大,遍历一次就OK了
    2. 如果只是一次性处理,拿到本地跑就行了
    yanze0613
        21
    yanze0613  
       May 11, 2015
    读写分离,或者定期作业
    knightlhs
        22
    knightlhs  
       May 11, 2015
    1、要做读写分离 否则 容易遇到锁
    2、按需增加索引 加快扫描速度
    3、整理业务 可以合并的合并成一条 sql 不能合并 且量大的情况下 启用队列
    4、实时性不高的业务 做成定时任务 在负载低的时段后端以 cli 方式运行
    fangjinmin
        23
    fangjinmin  
       May 11, 2015
    10多万条数据不多,每次取少一点数据,用offset limit来取吧,这样会快一些。
    akira
        24
    akira  
       May 12, 2015
    这种一般是sql没优化好的可能性比较大。。
    About     Help     Advertise     Blog     API     FAQ     Solana     3118 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 68ms UTC 00:03 PVG 08:03 LAX 17:03 JFK 20:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86