主頁 > 知識(shí)庫 > mysql 循環(huán)批量插入的實(shí)例代碼詳解

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

熱門標(biāo)簽:自己做地圖標(biāo)注需要些什么 中國地圖標(biāo)注公司 天津公司外呼系統(tǒng)軟件 昌德訊外呼系統(tǒng) 徐涇鎮(zhèn)騰訊地圖標(biāo)注 百度地圖標(biāo)注要什么軟件 電話機(jī)器人的價(jià)格多少錢一個(gè)月 400電話申請廠家現(xiàn)貨 福建外呼電銷機(jī)器人加盟

背景

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

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

尋思著分頁時(shí)標(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;

為了方便操作,插入操作使用存儲(chǔ)過程通過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í)行時(shí)間大概在6m7s,按照這個(gè)速度,要插入1000W級(jí)數(shù)據(jù),估計(jì)要跑幾天。

2、于是,構(gòu)思加個(gè)事務(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í)行時(shí)間 6 min 16 sec,與不加commit執(zhí)行差別不大,看來,這種方式做批量插入,性能是很低的。

3、使用存儲(chǔ)過程生成批量插入語句執(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í)行時(shí)間 3.308s。

總結(jié)

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

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

您可能感興趣的文章:
  • mysql大批量插入數(shù)據(jù)的4種方法示例
  • MYSQL批量插入數(shù)據(jù)的實(shí)現(xiàn)代碼
  • MySQL實(shí)現(xiàn)批量插入以優(yōu)化性能的教程
  • MySQL批量插入遇上唯一索引避免方法
  • Mysql使用insert插入多條記錄 批量新增數(shù)據(jù)
  • MYSQL開發(fā)性能研究之批量插入數(shù)據(jù)的優(yōu)化方法
  • MySQL批量插入數(shù)據(jù)腳本
  • MySQL批量SQL插入性能優(yōu)化詳解
  • MySql批量插入優(yōu)化Sql執(zhí)行效率實(shí)例詳解
  • MySQL如何快速批量插入1000w條數(shù)據(jù)

標(biāo)簽:荊門 梅河口 黔西 昌都 陜西 北京 駐馬店 鄂爾多斯

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql 循環(huán)批量插入的實(shí)例代碼詳解》,本文關(guān)鍵詞  mysql,循環(huán),批量,插入,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mysql 循環(huán)批量插入的實(shí)例代碼詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于mysql 循環(huán)批量插入的實(shí)例代碼詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章