首页  >  问答  >  正文

mysql - php 批量插入10w 条内容导致内存撑爆128mb 怎么处理?

因为有一个业务设计到批量生成记录,一次性生成10w条内容(内容大部分相同,有的字段需要生成随机码),需要怎么处理?

PHPzPHPz2717 天前906

全部回复(3)我来回复

  • ringa_lee

    ringa_lee2017-06-05 11:09:07

    那些说用异步,循环什么,个人觉得不合理.
    10w条数据啊,你就算内存够大,数据存进数据库里也会占用很多时间(IO流),甚至如果事务提交没处理好数据库也会占用内存.

    直接在数据库里直接生成数据才是最快的办法.
    自己生成一张id表(只存id一个字段),记录10w条(0-10w)
    mysql做法:

    insert into table t
    select i.id, concat('名字', i.id) name, 
        concat('随机生成码7-12:',FLOOR(7 + (RAND() * 6))) rand,
        ifnull(a.nickname, 'No nickname') nickname,
        uuid() descript, --随机字符串
        from_unixtime(unix_timestamp("20170101000000")+FLOOR((RAND()*60*60*24*365)))  --2017年中随机日期
    from table_id i
    left join table_account a on a.id=FLOOR((RAND()*12)) --如果数据来源另外一些表
    where i.id < 1000  --如果只要生成1000条

    回复
    0
  • 天蓬老师

    天蓬老师2017-06-05 11:09:07

    实在不愿意分批处理,ini_set('’memory_limit', '256M'); 一下?或者你服务器内存不吃紧的话设成 512M

    回复
    0
  • 天蓬老师

    天蓬老师2017-06-05 11:09:07

    1.假如生成的数据用链式结构保存,建议优化数据结构,如假如大部分数据相同可以用键值保存相同数据,跟住用子键值保存不同的数据(即求同存异)

    array (0=>array('data'=>array('name'=>'t','age'=>'14),'key'=>array('1','2' ,'3','4')));
    foreach($array as $val) {

    foreach($val['key']=>$kval) {
        var_dump($kval);
        var_dump($val);
    }

    }

    2.一次性保存10条数据,对mysql服务器压力加重,建议优化insert代码,如
    insert into table values('t','a',1),('t','a',2)

    3.建议开启事务,定量提交数据

    回复
    0
  • 取消回复