mysql迴圈插入千萬級資料
阿新 • • 發佈:2018-12-22
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) BEGIN DECLARE 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萬條資料插入,結果耗時
參考連結:https://blog.csdn.net/xiakepan/article/details/52703189