V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Nixus
V2EX  ›  PHP

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

  •  
  •   Nixus · 2015-05-11 09:27:10 +08:00 · 3760 次点击
    这是一个创建于 3274 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    有什么好的解决方案?

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

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

    功能很简单,就是做的时候很蛋疼,我一般是想要很精确的那种匹配,但是因为跟单日志是跟单人员自己弄的,里面的时间不可能准确,所以匹配录音和日志的时候就用了一个时间段,所有落到这个时间段的同一个号码的录音都认为是跟单人员跟客户交流的
    lincanbin
        19
    lincanbin  
       2015-05-11 12:47:15 +08:00
    就我一个人觉得楼主是把所有数据全部拿到PHP里,然后用PHP查找么?
    Lucups
        20
    Lucups  
       2015-05-11 13:07:02 +08:00
    1. 对号码做索引 或者 根据 号码查 录音文件,十几万条数据量并不大,遍历一次就OK了
    2. 如果只是一次性处理,拿到本地跑就行了
    yanze0613
        21
    yanze0613  
       2015-05-11 13:23:09 +08:00
    读写分离,或者定期作业
    knightlhs
        22
    knightlhs  
       2015-05-11 15:01:46 +08:00
    1、要做读写分离 否则 容易遇到锁
    2、按需增加索引 加快扫描速度
    3、整理业务 可以合并的合并成一条 sql 不能合并 且量大的情况下 启用队列
    4、实时性不高的业务 做成定时任务 在负载低的时段后端以 cli 方式运行
    fangjinmin
        23
    fangjinmin  
       2015-05-11 18:21:20 +08:00
    10多万条数据不多,每次取少一点数据,用offset limit来取吧,这样会快一些。
    akira
        24
    akira  
       2015-05-12 01:02:15 +08:00
    这种一般是sql没优化好的可能性比较大。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2846 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 06:29 · PVG 14:29 · LAX 23:29 · JFK 02:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.