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 < 3000 do INSERT into mysql_genarate(uuid) VALUES(UUID()); set i = i + 1; end while; end #
使用 call test_two1(); 測試,3000條資料耗時74秒,如果是千萬級數據,這個速度將無法忍受。
所以我在網路上找了一下優化的方法,發現可以拼接批量插入的sql語句,速度提升很多;
3.優化後的預存程序
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 do set @exedata = concat(@exedata, ",(UUID())"); set count=count+1; set i=i+1; if i%1000=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; set @exedata = ""; end if;end while;if length(@exedata)>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;
呼叫 call insertPro(3000) ,耗時零點幾秒,這個速度可以接受。
接著呼叫 call insertPro(30000000) ;
測試3000萬個資料插入,結果耗時1824.203s(30分鐘)。個人電腦這個速度可以了。
另外,採用java多執行緒同時拼接sql,每10000條提交一次的方式,在8個執行緒同時運行的情況下,3000萬個資料插入耗時336s,1億個資料插入耗時1087s。
相關參考:MySQL教學
以上是mysql如何實現循環插入千萬級數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!