mysql如何實現循環插入千萬級數據?
1.建表:
CREATE?TABLE?`mysql_genarate`?(?? `id`?int(11)?NOT?NULL?AUTO_INCREMENT,?? `uuid`?varchar(50)?DEFAULT?NULL,?? PRIMARY?KEY?(`id`) )?ENGINE=InnoDB?AUTO_INCREMENT=5990001?DEFAULT?CHARSET=utf8
2.創建一條條循環插入的存儲過程
create?procedure?test_two1() ?????begin ????????declare?i?int?default?0;???????while?i?<p>使用?call test_two1();?測試,3000條數據耗時74秒,如果是千萬級數據,這個速度將無法忍受。</p><p>所以我在網上找了一下優化的方法,發現可以拼接批量插入的sql語句,速度提升很多;</p><p>3.優化后的存儲過程</p><pre class="brush:sql;toolbar:false">CREATE?PROCEDURE?insertPro(in?sum?INT)BEGINDECLARE?count?INT?DEFAULT?0;DECLARE?i?INT?DEFAULT?0; set?@exesql?=?concat("insert?into?mysql_genarate(uuid)?values"); set?@exedata?=?""; set?count=0; set?i=0;while?count<sum>0?then? ????set?@exedata?=?SUBSTRING(@exedata,?2); ????set?@exesql?=?concat("insert?into?mysql_genarate(uuid)?values?",?@exedata); ????prepare?stmt?from?@exesql; ????execute?stmt;????DEALLOCATE?prepare?stmt;end?if;end;</sum>
調用?call insertPro(3000)?,耗時零點幾秒,這個速度可以接受。
接著調用?call insertPro(30000000)?;測試3000萬條數據插入,結果耗時1824.203s(30分鐘)。個人電腦這個速度可以了。
另外,采用java多線程同時拼接sql,每10000條提交一次的方式,在8個線程同時運行的情況下,3000萬條數據插入耗時336s,1億條數據插入耗時1087s。
相關參考:MySQL教程
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦