Mysql - PHP memasukkan 100,000 keping kandungan dalam kelompok, menyebabkan memori pecah kepada 128MB Bagaimana untuk menanganinya?
PHPz2017-06-05 11:07:07
0
3
927
Oleh kerana terdapat reka bentuk perniagaan yang menjana rekod dalam kelompok dan menjana 100,000 keping kandungan pada satu masa (kebanyakan kandungan adalah sama, dan beberapa medan perlu menjana kod rawak), apa yang perlu dilakukan
Mereka yang bercakap tentang menggunakan asynchronous dan looping, saya secara peribadi berpendapat ia adalah tidak munasabah Dengan 100,000 keping data, walaupun memori anda cukup besar, ia akan mengambil banyak masa untuk menyimpan data dalam pangkalan data (aliran IO). , dan walaupun penyerahan transaksi tidak diproses dengan baik, pangkalan data akan menduduki memori.
Cara terpantas ialah menjana data terus dalam pangkalan data Jana sendiri jadual id (hanya satu medan id disimpan) dan rekod 100,000 entri (0-10w) Kaedah 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条
Saya benar-benar tidak mahu memprosesnya secara berkelompok, ini_set(''memory_limit', '256M');? Atau jika memori pelayan anda tidak ketat, tetapkan ia kepada 512J
1. Jika data yang dijana disimpan dalam struktur rantai, adalah disyorkan untuk mengoptimumkan struktur data Jika kebanyakan data adalah sama, anda boleh menggunakan nilai utama untuk menyimpan data yang sama, dan kemudian menggunakan sub-. nilai utama untuk menyimpan data yang berbeza (iaitu mencari titik persamaan sambil menempah perbezaan) Seperti array (0=>array('data'=>array('name'=>'t','age' =>'14),'key'=>array('1','2' ,'3','4'))); foreach($array as $val) {
2. Menyimpan 10 keping data pada satu masa akan memberi lebih tekanan pada pelayan MySQL Adalah disyorkan untuk mengoptimumkan kod sisipan, seperti masukkan ke dalam nilai jadual('t','a',1),('. t','a',2)
3 Adalah disyorkan untuk membuka transaksi dan menyerahkan data secara kuantitatif
Mereka yang bercakap tentang menggunakan asynchronous dan looping, saya secara peribadi berpendapat ia adalah tidak munasabah
Dengan 100,000 keping data, walaupun memori anda cukup besar, ia akan mengambil banyak masa untuk menyimpan data dalam pangkalan data (aliran IO). , dan walaupun penyerahan transaksi tidak diproses dengan baik, pangkalan data akan menduduki memori.
Cara terpantas ialah menjana data terus dalam pangkalan data
Jana sendiri jadual id (hanya satu medan id disimpan) dan rekod 100,000 entri (0-10w)
Kaedah Mysql:
Saya benar-benar tidak mahu memprosesnya secara berkelompok, ini_set(''memory_limit', '256M');? Atau jika memori pelayan anda tidak ketat, tetapkan ia kepada 512J
1. Jika data yang dijana disimpan dalam struktur rantai, adalah disyorkan untuk mengoptimumkan struktur data Jika kebanyakan data adalah sama, anda boleh menggunakan nilai utama untuk menyimpan data yang sama, dan kemudian menggunakan sub-. nilai utama untuk menyimpan data yang berbeza (iaitu mencari titik persamaan sambil menempah perbezaan)
Seperti
array (0=>array('data'=>array('name'=>'t','age' =>'14),'key'=>array('1','2' ,'3','4')));
foreach($array as $val) {
}
2. Menyimpan 10 keping data pada satu masa akan memberi lebih tekanan pada pelayan MySQL Adalah disyorkan untuk mengoptimumkan kod sisipan, seperti
masukkan ke dalam nilai jadual('t','a',1),('. t','a',2)
3 Adalah disyorkan untuk membuka transaksi dan menyerahkan data secara kuantitatif