人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

mysql 循環(huán)批量插入的實(shí)例代碼詳解

發(fā)布日期:2022-03-11 13:38 | 文章來源:gibhub

背景

前幾天在MySql上做分頁時,看到有博文說使用 limit 0,10 方式分頁會有丟數(shù)據(jù)問題,有人又說不會,于是想自己測試一下。測試時沒有數(shù)據(jù),便安裝了一個MySql,建了張表,在建了個while循環(huán)批量插入10W條測試數(shù)據(jù)的時候,執(zhí)行時間之長無法忍受,便查資料找批量插入優(yōu)化方法,這里做個筆記。

數(shù)據(jù)結(jié)構(gòu)

尋思著分頁時標(biāo)準(zhǔn)列分主鍵列、索引列、普通列3種場景,所以,測試表需要包含這3種場景,建表語法如下:

drop table if exists `test`.`t_model`;
Create table `test`.`t_model`( 
 `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
 `uid` bigint COMMENT '業(yè)務(wù)主鍵',
 `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循環(huán)插入有序數(shù)據(jù),未驗(yàn)證其他操作方式或循環(huán)方式的性能。

執(zhí)行過程

1、使用最簡單的方式直接循環(huán)單條插入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條數(shù)據(jù),執(zhí)行時間大概在6m7s,按照這個速度,要插入1000W級數(shù)據(jù),估計(jì)要跑幾天。

2、于是,構(gòu)思加個事務(wù)提交,是否能加快點(diǎn)性能呢?測試每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 ;

執(zhí)行時間 6 min 16 sec,與不加commit執(zhí)行差別不大,看來,這種方式做批量插入,性能是很低的。

3、使用存儲過程生成批量插入語句執(zhí)行批量插入插入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 ;

執(zhí)行時間 3.308s。

總結(jié)

批量插入時,使用insert的values批量方式插入,執(zhí)行速度大大提升。

以上所述是小編給大家介紹的mysql 循環(huán)批量插入的實(shí)例代碼詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對本站網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

國外服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實(shí)時開通

自選配置、實(shí)時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部