1. 程式人生 > >mysql迴圈插入千萬級資料

mysql迴圈插入千萬級資料

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