mysql - php 批量插入10w 条内容导致内存撑爆128mb 怎么处理?
PHPz
PHPz 2017-06-05 11:07:07
[PHP讨论组]

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

PHPz
PHPz

学习是最好的投资!

全部回复(3)
ringa_lee

那些说用异步,循环什么,个人觉得不合理.
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条
天蓬老师

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

天蓬老师

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.建議開啟事務,定量提交數據

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号