Mysql – PHP fügt stapelweise 100.000 Inhalte ein, wodurch der Speicher auf 128 MB ansteigt. Wie gehe ich damit um?
PHPz2017-06-05 11:07:07
0
3
904
Da es ein Geschäftsdesign gibt, bei dem Datensätze stapelweise und 100.000 Inhalte gleichzeitig generiert werden (der größte Teil des Inhalts ist derselbe und einige Felder müssen Zufallscodes generieren), was muss getan werden
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条
那些说用异步,循环什么,个人觉得不合理.
10w条数据啊,你就算内存够大,数据存进数据库里也会占用很多时间(IO流),甚至如果事务提交没处理好数据库也会占用内存.
直接在数据库里直接生成数据才是最快的办法.
自己生成一张id表(只存id一个字段),记录10w条(0-10w)
mysql做法:
实在不愿意分批处理,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) {
}
2.一次性保存10條數據,對mysql服務器壓力加重,建議優化insert代碼,如
insert into table values('t','a',1),('t','a',2)
3.建議開啟事務,定量提交數據