色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MySQL批量插入數據的四種方案(性能測試對比)

Android編程精選 ? 來源:CSDN技術社區 ? 作者:CSDN技術社區 ? 2022-10-28 09:43 ? 次閱讀

本文記錄個人使用MySQL插入大數據總結較實用的方案,通過對常用插入大數據的4種方式進行測試,即for循環單條、拼接SQL、批量插入saveBatch()、循環 + 開啟批處理模式,得出比較實用的方案心得。

一、前言

最近趁空閑之余,在對MySQL數據庫進行插入數據測試,對于如何快速插入數據的操作無從下手,在僅1W數據量的情況下,竟花費接近47s,實在不忍直視!在不斷摸索之后,整理出一些較實用的方案。

二、準備工作

測試環境:SpringBoot項目、MyBatis-Plus框架、MySQL8.0.24、JDK13

前提:SpringBoot項目集成MyBatis-Plus上述文章有配置過程,同時實現IService接口用于進行批量插入數據操作saveBatch()方法

1、Maven項目中pom.xml文件引入的相關依賴如下



 

org.springframework.boot
spring-boot-starter-web


 

com.baomidou
mybatis-plus-boot-starter
3.3.1


 

mysql
mysql-connector-java


 

org.projectlombok
lombok



2、application.yml配置屬性文件內容(重點:開啟批處理模式)

server:
#端口號
port:8080

#MySQL連接配置信息(以下僅簡單配置,更多設置可自行查看)
spring:
datasource:
#連接地址(解決UTF-8中文亂碼問題+時區校正)
#(rewriteBatchedStatements=true開啟批處理模式)
url:jdbc//127.0.0.1:3306/bjpowernode?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
#用戶名
username:root
#密碼
password:xxx
#連接驅動名稱
driver-class-name:com.mysql.cj.jdbc.Driver

3、Entity實體類(測試)

/**
*Student測試實體類
*
*@Data注解:引入Lombok依賴,可省略Setter、Getter方法
*@authorLBF
*@date2022/3/1816:06
*/
@Data
@TableName(value="student")
publicclassStudent{

/**主鍵type:自增*/
@TableId(type=IdType.AUTO)
privateintid;

/**名字*/
privateStringname;

/**年齡*/
privateintage;

/**地址*/
privateStringaddr;

/**地址號@TableField:與表字段映射*/
@TableField(value="addr_num")
privateStringaddrNum;

publicStudent(Stringname,intage,Stringaddr,StringaddrNum){
this.name=name;
this.age=age;
this.addr=addr;
this.addrNum=addrNum;
}
}

4、數據庫student表結構(注意:無索引)

f637d748-5608-11ed-a3b6-dac502259ad0.png

三、測試工作

簡明:完成準備工作后,即對for循環、拼接SQL語句、批量插入saveBatch()、循環插入+開啟批處理模式,該4種插入數據的方式進行測試性能。

注意:測試數據量為5W、單次測試完清空數據表(確保不受舊數據影響)

以下測試內容可能受測試配置環境、測試規范和數據量等諸多因素影響,讀者可自行結合參考進行測試

1、for循環插入(單條)(總耗時:177秒)

總結:測試平均時間約是177秒,實在是不忍直視(捂臉),因為利用for循環進行單條插入時,每次都是在獲取連接(Connection)、釋放連接和資源關閉等操作上,(如果數據量大的情況下)極其消耗資源,導致時間長。

@GetMapping("/for")
publicvoidforSingle(){
//開始時間
longstartTime=System.currentTimeMillis();
for(inti=0;i

(1)第一次測試結果:190155 約等于 190秒

f666ff0a-5608-11ed-a3b6-dac502259ad0.png

(2)第二次測試結果:175926 約等于 176秒(服務未重啟)

f67bef8c-5608-11ed-a3b6-dac502259ad0.png

(3)第三次測試結果:174726 約等于 174秒(服務重啟)

f69ac7e0-5608-11ed-a3b6-dac502259ad0.png

2、拼接SQL語句(總耗時:2.9秒)

簡明:拼接格式:insert into student(xxxx) value(xxxx),(xxxx),(xxxxx).......

總結:拼接結果就是將所有的數據集成在一條SQL語句的value值上,其由于提交到服務器上的insert語句少了,網絡負載少了,性能也就提上去。

但是當數據量上去后,可能會出現內存溢出、解析SQL語句耗時等情況,但與第一點相比,提高了極大的性能。

@GetMapping("/sql")
publicvoidsql(){
ArrayListarrayList=newArrayList<>();
longstartTime=System.currentTimeMillis();
for(inti=0;i
//使用@Insert注解插入:此處為簡便,不寫Mapper.xml文件
@Insert("")
intinsertSplice(@Param("studentList")ListstudentList);

(1)第一次測試結果:3218 約等于 3.2秒

f6b57d9c-5608-11ed-a3b6-dac502259ad0.png

(2)第二次測試結果:2592 約等于 2.6秒(服務未重啟)

f6ccc786-5608-11ed-a3b6-dac502259ad0.png

(3)第三次測試結果:3082 約等于 3.1秒(服務重啟)

f6e4dfc4-5608-11ed-a3b6-dac502259ad0.png

3、批量插入saveBatch(總耗時:2.7秒)

簡明:使用MyBatis-Plus實現IService接口中批處理saveBatch()方法,對底層源碼進行查看時,可發現其實是for循環插入,但是與第一點相比,為什么性能上提高了呢?因為利用分片處理(batchSize = 1000) + 分批提交事務的操作,從而提高性能,并非在Connection上消耗性能。

@GetMapping("/saveBatch1")
publicvoidsaveBatch1(){
ArrayListarrayList=newArrayList<>();
longstartTime=System.currentTimeMillis();
//模擬數據
for(inti=0;i

(1)第一次測試結果:2864 約等于 2.9秒

f6f9376c-5608-11ed-a3b6-dac502259ad0.png

(2)第二次測試結果:2302 約等于 2.3秒(服務未重啟)

f711f1da-5608-11ed-a3b6-dac502259ad0.png

(3)第三次測試結果:2893 約等于 2.9秒(服務重啟)

f725f680-5608-11ed-a3b6-dac502259ad0.png

重點注意:MySQL JDBC驅動默認情況下忽略saveBatch()方法中的executeBatch()語句,將需要批量處理的一組SQL語句進行拆散,執行時一條一條給MySQL數據庫,造成實際上是分片插入,即與單條插入方式相比,有提高,但是性能未能得到實質性的提高。

測試:數據庫連接URL地址缺少 rewriteBatchedStatements = true 參數情況

#MySQL連接配置信息
spring:
datasource:
#連接地址(未開啟批處理模式)
url:jdbc//127.0.0.1:3306/bjpowernode?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
#用戶名
username:root
#密碼
password:xxx
#連接驅動名稱
driver-class-name:com.mysql.cj.jdbc.Driver

測試結果:10541 約等于 10.5秒(未開啟批處理模式)

f737150a-5608-11ed-a3b6-dac502259ad0.png

4、循環插入 + 開啟批處理模式(總耗時:1.7秒)(重點:一次性提交)

簡明:開啟批處理,關閉自動提交事務,共用同一個SqlSession之后,for循環單條插入的性能得到實質性的提高;由于同一個SqlSession省去對資源相關操作的耗能、減少對事務處理的時間等,從而極大程度上提高執行效率。(目前個人覺得最優方案)

@GetMapping("/forSaveBatch")
publicvoidforSaveBatch(){
//開啟批量處理模式BATCH、關閉自動提交事務false
SqlSessionsqlSession=sqlSessionFactory.openSession(ExecutorType.BATCH,false);
//反射獲取,獲取Mapper
StudentMapperstudentMapper=sqlSession.getMapper(StudentMapper.class);
longstartTime=System.currentTimeMillis();
for(inti=0;i

(1)第一次測試結果:1831 約等于 1.8秒

f74cf744-5608-11ed-a3b6-dac502259ad0.png

(2)第二次測試結果:1382 約等于 1.4秒(服務未重啟)

f761abb2-5608-11ed-a3b6-dac502259ad0.png

(3)第三次測試結果:1883 約等于 1.9秒(服務重啟)

f776d226-5608-11ed-a3b6-dac502259ad0.png

四、總結

本文記錄個人學習MySQL插入大數據一些方案心得,可得知主要是在獲取連接、關閉連接、釋放資源和提交事務等方面較耗能,其中最需要注意是開啟批處理模式,即URL地址的參數:rewriteBatchedStatements = true,否則也無法發揮作用。

對于測試方案的設定、對考慮不周、理解和編寫錯誤的地方等情況,請多指出,共同學習!

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3794

    瀏覽量

    64362
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14338
  • MySQL
    +關注

    關注

    1

    文章

    804

    瀏覽量

    26531

原文標題:MySQL批量插入數據的四種方案(性能測試對比)

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGA 設計的四種常用思想與技巧

    FPGA 設計的四種常用思想與技巧FPGA設計的四種常用思想與技巧 討論的四種常用FPGA/CPLD設計思想與技巧:乒乓操作、串并轉換、流水線操作、數據接口同步化,都是FPGA/CP
    發表于 08-11 10:30

    數據四種思維方式

    數據所帶來的四種思維方式的轉變
    發表于 08-12 11:37

    labview插入數據MySQL數據

    最近在用labview寫入數據MySQL數據庫,遇到一個問題:(如圖片所示)利用insert指令插入數據,為什么每次
    發表于 12-26 16:52

    幾種數據庫的大數據批量插入解決方法

    在之前只知道SqlServer支持數據批量插入,殊不知道Oracle、SQLite和MySql也是支持的,不過Oracle需要使用Orace.DataAccess驅動,今天就貼出幾種
    發表于 11-04 07:59

    ModBus四種數據DI/DO/AI/AO是什么?

    ModBus四種數據DI/DO/AI/AO是什么?
    發表于 11-02 07:14

    測試比較四種Arduino Nano全新型號的數據詳細說明

    本文檔的主要內容詳細介紹的是測試比較四種Arduino Nano全新型號的數據詳細說明。
    發表于 11-29 15:31 ?25次下載
    <b class='flag-5'>測試</b>比較<b class='flag-5'>四種</b>Arduino Nano全新型號的<b class='flag-5'>數據</b>詳細說明

    MySQL數據庫:如何操作禁止重復插入數據

    MySQL進行數據插入操作時,總是會考慮是否會插入重復數據,之前的操作都是先根據主鍵或者唯一約束條件進行查詢,有就進行更新沒有就進行
    的頭像 發表于 10-08 14:15 ?3310次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>數據</b>庫:如何操作禁止重復<b class='flag-5'>插入</b><b class='flag-5'>數據</b>

    MySQL 5.7與MySQL 8.0 性能對比

    背景 測試mysql5.7和mysql8.0分別在讀寫,選定,只寫模式下不同并發時的性能(tps,qps) 最早 測試使用版本為
    的頭像 發表于 11-03 09:26 ?1.7w次閱讀
    <b class='flag-5'>MySQL</b> 5.7與<b class='flag-5'>MySQL</b> 8.0 <b class='flag-5'>性能對比</b>

    四種門電路符號的詳細對比

    以下四種門電路符號對比,你更常用哪一
    發表于 02-09 17:05 ?1.4w次閱讀
    <b class='flag-5'>四種</b>門電路符號的詳細<b class='flag-5'>對比</b>

    MySQL 批量插入不重復數據的解決方法

    業務很簡單:需要批量插入一些數據數據來源可能是其他數據庫的表,也可能是一個外部excel的導入
    的頭像 發表于 07-02 15:28 ?2274次閱讀
    <b class='flag-5'>MySQL</b> <b class='flag-5'>批量</b><b class='flag-5'>插入</b>不重復<b class='flag-5'>數據</b>的解決方法

    MyBatis批量插入數據的3方法你知道幾種

    批量插入功能是我們日常工作中比較常見的業務功能之一, 今天 來一個 MyBatis 批量插入的匯總篇,同時對 3 實現方法做一個
    的頭像 發表于 12-08 17:56 ?4248次閱讀
    MyBatis<b class='flag-5'>批量</b><b class='flag-5'>插入</b><b class='flag-5'>數據</b>的3<b class='flag-5'>種</b>方法你知道幾種

    目前HD地圖構建的四種主流方案的優勢與不足對比

    本文將帶領讀者深入探討這四種方案的優勢與不足,通過對比方案來思考HD地圖構建的重點與難點。當然筆者水平有限,如果有理解錯誤的地方歡迎大家一起討論,共同學習。 溫馨提示,本文討論的方案
    的頭像 發表于 12-12 10:26 ?3157次閱讀

    MySQL在執行批量操作的時候一次插入多少數據才合適呢?

    我們在操作大型數據表或者日志文件的時候經常會需要寫入數據數據庫,那么最合適的方案就是數據庫的批量
    的頭像 發表于 01-31 14:09 ?7556次閱讀

    NoSQL數據庫的四種類型

    在本文中,我們將簡要介紹NoSQL數據庫的四種類型。
    的頭像 發表于 04-25 17:21 ?4406次閱讀

    測試電容器的四種方法有哪些

    測試電容器的四種方法 電容器是一非常常見的電子元件,它具有存儲電能的能力。測試電容器的方法也非常多,下面我們將詳細介紹四種常見的
    的頭像 發表于 09-01 15:11 ?1.4w次閱讀
    主站蜘蛛池模板: 亚洲伊人精品综合在合线| 国产亚洲精品久久久999无毒 | 久久九九日本韩国精品| 成人在线视频免费看| 亚洲午夜久久久无码精品网红A片| 亚洲成年男人的天堂网| 秋霞成人午夜鲁丝一区二区三区| 少妇高潮惨叫久久久久久电影| 亚洲国产成人精品不卡青青草原 | 约艺术院校96年清纯白嫩| 亚洲女人毛片| 亚洲精品免费在线视频| 亚洲日本欧美产综合在线| 97在线精品视频| 99精品视频在线观看免费播放| 亚洲综合AV在线在线播放| 先锋影音av最新资源网| 97超碰在线视频 免费| 亚洲国产日韩欧美高清片a| 色久久一个亚洲综合网| 亚洲zooz人禽交xxxx| 边做边爱播放3免费观看| 99久久99久久精品| 国产精品视频成人| 国产人妻人伦精品久久无码| 国产亚洲精品V在线观看一| 欧美激情精品久久久久| 任你躁国语自产二区在线播放| 偷偷鲁青春草原视频分类| 最近免费中文字幕大全免费| 古风H啪肉NP文| 国产精品亚洲视频在线观看| 老鸭窝毛片| 色婷婷AV99XX| 99久久国产露脸精品国产吴梦梦| 欧美成人国产| 真人美女精美小穴| 粉嫩小护士| 日本学生VIDEOVIDEOS更新| 97人妻在线公开视频在线观看| 混乱家庭电影完整版在线看|