首頁  >  問答  >  主體

mysql - php 批次插入10w 筆內容導致記憶體撐爆128mb 怎麼處理?

因為有一個業務設計到批量生成記錄,一次生成10w條內容(內容大部分相同,有的字段需要生成隨機碼),需要怎麼處理?

PHPzPHPz2714 天前905

全部回覆(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
  • 取消回覆