背景
前幾天在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ù),未驗證其他操作方式或循環(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ù),估計要跑幾天。
2、于是,構(gòu)思加個事務(wù)提交,是否能加快點性能呢?測試每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)批量插入的實例代碼詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
標(biāo)簽:荊門 梅河口 黔西 昌都 陜西 北京 駐馬店 鄂爾多斯
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql 循環(huán)批量插入的實例代碼詳解》,本文關(guān)鍵詞 mysql,循環(huán),批量,插入,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。