mysql 迴圈插入 mysql 迴圈批量插入

2021-10-25 14:31:02 字數 2385 閱讀 1054

背景

前幾天在mysql上做分頁時,看到有博文說使用 limit 0,10 方式分頁會有丟資料問題,有人又說不會,於是想自己測試一下。測試時沒有資料,便安裝了乙個mysql,建了張表,在建了個while迴圈批量插入10w條測試資料的時候,執行時間之長無法忍受,便查資料找批量插入優化方法,這裡做個筆記。

資料結構

尋思著分頁時標準列分主鍵列、索引列、普通列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 existsmy_procedure;

delimiter//

create proceduremy_procedure()begin

declare n int default 1;while n < 10001doinsert 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 procedureu_head_and_low_pro()begin

declare n int default 17541;while n < 10001doinsert 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 existsu_head_and_low_pro;

delimiter $$create procedureu_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 < 10001doset @exedata = concat(@exedata,"(",n,",","'id20170831",n,"','","name",n,"','","desc'",")");if n % 1000 = 0

then

set @exesql = concat(@exesql,@exedata,";");prepare stmt from @exesql;executestmt;deallocate preparestmt;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 ;

執行時間 3.308s。

總結批量插入時,使用insert的values批量方式插入,執行速度大大提公升。

mysql迴圈插入資料

drop procedure dowhile create procedure dowhile begin declare i int default 0 start transaction 定義事務 while i 100 do insert into user basic username,pa...

迴圈插入資料 mysql

插入語句常用寫法 insert into table id,name,addr,tel values 這種方式一次只能一次插入一條資料,要想插入多條資料,就得通過迴圈多次呼叫sql語句,以為著多次與資料庫建立連線。但是這樣 就又增加了伺服器的負荷,因為,執行每一次sql伺服器都要同樣對sql進行分析...

mysql迴圈插入資料

實驗中經常會遇到需要多條資料的情況就想到了用sql語句迴圈生成資料 當然可以在插入的時候在名字屬性上該些變動 drop procedure if exists test insert delimiter create procedure test insert begin declare y big...