您好,登錄后才能下訂單哦!
mysql中怎么實現循環批量插入,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
數據結構
尋思著分頁時標準列分主鍵列、索引列、普通列3種場景,所以,測試表需要包含這3種場景,建表語法如下:
drop table if exists `test`.`t_model`; Create table `test`.`t_model`( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主鍵', `uid` bigint COMMENT '業務主鍵', `modelid` varchar(50) COMMENT '字符主鍵', `modelname` varchar(50) COMMENT '名稱', `desc` varchar(50) COMMENT '描述', primary key (`id`), UNIQUE index `uid_unique` (`uid`), key `modelid_index` (`modelid`) USING BTREE ) ENGINE=InnoDB charset=utf8 collate=utf8_bin;
為了方便操作,插入操作使用存儲過程通過while循環插入有序數據,未驗證其他操作方式或循環方式的性能。
執行過程
1、使用最簡單的方式直接循環單條插入1W條,語法如下:
drop procedure if exists my_procedure; delimiter // create procedure my_procedure() begin DECLARE n int DEFAULT 1; WHILE n < 10001 DO insert into t_model (uid,modelid,modelname,`desc`) value (n,CONCAT('id20170831',n),CONCAT('name',n),'desc'); set n = n + 1; END WHILE; end // delimiter ;
插入1W條數據,執行時間大概在6m7s,按照這個速度,要插入1000W級數據,估計要跑幾天。
2、于是,構思加個事務提交,是否能加快點性能呢?測試每1000條就commit一下,語法如下:
delimiter // create procedure u_head_and_low_pro() begin DECLARE n int DEFAULT 17541; WHILE n < 10001 DO insert into t_model (uid,modelid,modelname,`desc`) value (n,CONCAT('id20170831',n),CONCAT('name',n),'desc'); set n = n + 1; if n % 1000 = 0 then commit; end if; END WHILE; end // delimiter ;
執行時間 6 min 16 sec,與不加commit執行差別不大,看來,這種方式做批量插入,性能是很低的。
3、使用存儲過程生成批量插入語句執行批量插入插入1W條,語法如下:
drop procedure IF EXISTS u_head_and_low_pro; delimiter $$ create procedure u_head_and_low_pro() begin DECLARE n int DEFAULT 1; set @exesql = 'insert into t_model (uid,modelid,modelname,`desc`) values '; set @exedata = ''; WHILE n < 10001 DO set @exedata = concat(@exedata,"(",n,",","'id20170831",n,"','","name",n,"','","desc'",")"); if n % 1000 = 0 then set @exesql = concat(@exesql,@exedata,";"); prepare stmt from @exesql; execute stmt; DEALLOCATE prepare stmt; commit; set @exesql = 'insert into t_model (uid,modelid,modelname,`desc`) values '; set @exedata = ""; else set @exedata = concat(@exedata,','); end if; set n = n + 1; END WHILE; end;$$ delimiter ;
關于mysql中怎么實現循環批量插入問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。