您好,登錄后才能下訂單哦!
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如何實現循環插入千萬級數據的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。