衡阳派盒市场营销有限公司

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

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

3天內不再提示

利用JAVA向Mysql插入一億數量級數據

Android編程精選 ? 來源:CSDN ? 2023-04-03 10:00 ? 次閱讀

利用JAVA向Mysql插入一億數量級數據—效率測評

這幾天研究mysql優化中查詢效率時,發現測試的數據太少(10萬級別),利用 EXPLAIN 比較不同的 SQL 語句,不能夠得到比較有效的測評數據,大多模棱兩可,不敢通過這些數據下定論。

所以通過隨機生成人的姓名、年齡、性別、電話、email、地址 ,向mysql數據庫大量插入數據,便于用大量的數據測試 SQL 語句優化效率。、在生成過程中發現使用不同的方法,效率天差萬別。

1、先上Mysql數據庫,隨機生成的人員數據圖。分別是ID、姓名、性別、年齡、Email、電話、住址。

下圖一共三千三百萬數據:

45faa910-d14a-11ed-bfe3-dac502259ad0.png

在數據量在億級別時,別點下面按鈕,會導致Navicat持續加載這億級別的數據,導致電腦死機。~覺著自己電腦配置不錯的可以去試試,可能會有驚喜

4614c354-d14a-11ed-bfe3-dac502259ad0.png

2、本次測評一共通過三種策略,五種情況,進行大批量數據插入測試

策略分別是:

Mybatis 輕量級框架插入(無事務)

采用JDBC直接處理(開啟事務、無事務)

采用JDBC批處理(開啟事務、無事務)

測試結果:

Mybatis輕量級插入 -> JDBC直接處理 -> JDBC 批處理。

JDBC 批處理,效率最高

第一種策略測試:

2.1 Mybatis 輕量級框架插入(無事務)

Mybatis是一個輕量級框架,它比hibernate輕便、效率高。

但是處理大批量的數據插入操作時,需要過程中實現一個ORM的轉換,本次測試存在實例,以及未開啟事務,導致mybatis效率很一般。

這里實驗內容是:

利用Spring框架生成mapper實例、創建人物實例對象

循環更改該實例對象屬性、并插入。

//代碼內無事務

privatelongbegin=33112001;//起始id
privatelongend=begin+100000;//每次循環插入的數據量
privateStringurl="jdbc//localhost:3306/bigdata?useServerPrepStmts=false&rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8";
privateStringuser="root";
privateStringpassword="0203";


@org.junit.Test
publicvoidinsertBigData2()
{
//加載Spring,以及得到PersonMapper實例對象。這里創建的時間并不對最后結果產生很大的影響
ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");
PersonMapperpMapper=(PersonMapper)context.getBean("personMapper");
//創建一個人實例
Personperson=newPerson();
//計開始時間
longbTime=System.currentTimeMillis();
//開始循環,循環次數500W次。
for(inti=0;i<5000000;i++)
????????{
????????????//為person賦值
????????????person.setId(i);
????????????person.setName(RandomValue.getChineseName());
????????????person.setSex(RandomValue.name_sex);
????????????person.setAge(RandomValue.getNum(1,?100));
????????????person.setEmail(RandomValue.getEmail(4,15));
????????????person.setTel(RandomValue.getTel());
????????????person.setAddress(RandomValue.getRoad());
????????????//執行插入語句
????????????pMapper.insert(person);
????????????begin++;
????????}
????????//計結束時間
????????long?eTime?=?System.currentTimeMillis();
????????System.out.println("插入500W條數據耗時:"+(eTime-bTime));
????}

本想測試插入五百萬條數據,但是實際運行過程中太慢,中途不得不終止程序。最后得到52W數據,大約耗時兩首歌的時間(7~9分鐘)。隨后,利用mybatis向mysql插入10000數據。

結果如下:

利用mybatis插入 一萬 條數據耗時:28613,即28.6秒

465531b4-d14a-11ed-bfe3-dac502259ad0.png

第二種策略測試:

2.2 采用JDBC直接處理(開啟事務、關閉事務)

采用JDBC直接處理的策略,這里的實驗內容分為開啟事務、未開啟事務是兩種,過程均如下:

利用PreparedStatment預編譯

循環,插入對應數據,并存入

事務對于插入數據有多大的影響呢? 看下面的實驗結果:

//該代碼為開啟事務
privatelongbegin=33112001;//起始id
privatelongend=begin+100000;//每次循環插入的數據量
privateStringurl="jdbc//localhost:3306/bigdata?useServerPrepStmts=false&rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8";
privateStringuser="root";
privateStringpassword="0203";


@org.junit.Test
publicvoidinsertBigData3(){
//定義連接、statement對象
Connectionconn=null;
PreparedStatementpstm=null;
try{
//加載jdbc驅動
Class.forName("com.mysql.jdbc.Driver");
//連接mysql
conn=DriverManager.getConnection(url,user,password);
//將自動提交關閉
conn.setAutoCommit(false);
//編寫sql
Stringsql="INSERTINTOpersonVALUES(?,?,?,?,?,?,?)";
//預編譯sql
pstm=conn.prepareStatement(sql);
//開始總計時
longbTime1=System.currentTimeMillis();

//循環10次,每次一萬數據,一共10萬
for(inti=0;i<10;i++)?{
????????????????//開啟分段計時,計1W數據耗時
????????????????long?bTime?=?System.currentTimeMillis();
????????????????//開始循環
????????????????while?(begin?

1、我們首先利用上述代碼測試無事務狀態下,插入10W條數據需要耗時多少。

如圖:

468035d0-d14a-11ed-bfe3-dac502259ad0.png

成功插入1W條數據耗時:21603
成功插入1W條數據耗時:20537
成功插入1W條數據耗時:20470
成功插入1W條數據耗時:21160
成功插入1W條數據耗時:23270
成功插入1W條數據耗時:21230
成功插入1W條數據耗時:20372
成功插入1W條數據耗時:22608
成功插入1W條數據耗時:20361
成功插入1W條數據耗時:20494
插入10W數據共耗時:212106

實驗結論如下:

在未開啟事務的情況下,平均每 21.2 秒插入 一萬 數據。

接著我們測試開啟事務后,插入十萬條數據耗時,如圖:

46aa1e40-d14a-11ed-bfe3-dac502259ad0.png

成功插入1W條數據耗時:4938
成功插入1W條數據耗時:3518
成功插入1W條數據耗時:3713
成功插入1W條數據耗時:3883
成功插入1W條數據耗時:3872
成功插入1W條數據耗時:3873
成功插入1W條數據耗時:3863
成功插入1W條數據耗時:3819
成功插入1W條數據耗時:3933
成功插入1W條數據耗時:3811
插入10W數據共耗時:39255

實驗結論如下:

開啟事務后,平均每 3.9 秒插入 一萬 數據

第三種策略測試:

2.3 采用JDBC批處理(開啟事務、無事務)

采用JDBC批處理時需要注意一下幾點:

1、在URL連接時需要開啟批處理、以及預編譯

Stringurl=“jdbc//localhost:3306/User?rewriteBatched
-Statements=true&useServerPrepStmts=false”;

2、PreparedStatement預處理sql語句必須放在循環體外

代碼如下:

privatelongbegin=33112001;//起始id
privatelongend=begin+100000;//每次循環插入的數據量
privateStringurl="jdbc//localhost:3306/bigdata?useServerPrepStmts=false&rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8";
privateStringuser="root";
privateStringpassword="0203";


@org.junit.Test
publicvoidinsertBigData(){
//定義連接、statement對象
Connectionconn=null;
PreparedStatementpstm=null;
try{
//加載jdbc驅動
Class.forName("com.mysql.jdbc.Driver");
//連接mysql
conn=DriverManager.getConnection(url,user,password);
//將自動提交關閉
//conn.setAutoCommit(false);
//編寫sql
Stringsql="INSERTINTOpersonVALUES(?,?,?,?,?,?,?)";
//預編譯sql
pstm=conn.prepareStatement(sql);
//開始總計時
longbTime1=System.currentTimeMillis();

//循環10次,每次十萬數據,一共1000萬
for(inti=0;i<10;i++)?{

????????????//開啟分段計時,計1W數據耗時
????????????long?bTime?=?System.currentTimeMillis();
????????????//開始循環
????????????while?(begin?

首先開始測試

無事務,每次循環插入10W條數據,循環10次,一共100W條數據。

結果如下圖:

46d5581c-d14a-11ed-bfe3-dac502259ad0.png

成功插入10W條數據耗時:3832
成功插入10W條數據耗時:1770
成功插入10W條數據耗時:2628
成功插入10W條數據耗時:2140
成功插入10W條數據耗時:2148
成功插入10W條數據耗時:1757
成功插入10W條數據耗時:1767
成功插入10W條數據耗時:1832
成功插入10W條數據耗時:1830
成功插入10W條數據耗時:2031
插入100W數據共耗時:21737

實驗結果:

使用JDBC批處理,未開啟事務下,平均每 2.1 秒插入 十萬 條數據

接著測試

開啟事務,每次循環插入10W條數據,循環10次,一共100W條數據。

結果如下圖:

470ee15e-d14a-11ed-bfe3-dac502259ad0.png

成功插入10W條數據耗時:3482
成功插入10W條數據耗時:1776
成功插入10W條數據耗時:1979
成功插入10W條數據耗時:1730
成功插入10W條數據耗時:1643
成功插入10W條數據耗時:1665
成功插入10W條數據耗時:1622
成功插入10W條數據耗時:1624
成功插入10W條數據耗時:1779
成功插入10W條數據耗時:1698
插入100W數據共耗時:19003

實驗結果:

使用JDBC批處理,開啟事務,平均每 1.9 秒插入 十萬 條數據

3 總結

能夠看到,在開啟事務下 JDBC直接處理 和 JDBC批處理 均耗時更短。

Mybatis 輕量級框架插入 , mybatis在我這次實驗被黑的可慘了,哈哈。實際開啟事務以后,差距不會這么大(差距10倍)。大家有興趣的可以接著去測試

JDBC直接處理,在本次實驗,開啟事務和關閉事務,耗時差距5倍左右,并且這個倍數會隨著數據量的增大而增大。因為在未開啟事務時,更新10000條數據,就得訪問數據庫10000次。導致每次操作都需要操作一次數據庫。

JDBC批處理,在本次實驗,開啟事務與關閉事務,耗時差距很微小(后面會增加測試,加大這個數值的差距)。但是能夠看到開啟事務以后,速度還是有提升。

結論:設計到大量單條數據的插入,使用JDBC批處理和事務混合速度最快

實測使用批處理+事務混合插入1億條數據耗時:174756毫秒

4 補充

JDBC批處理事務,開啟和關閉事務,測評插入20次,一次50W數據,一共一千萬數據耗時:

1、開啟事務(數據太長不全貼了)

插入1000W數據共耗時:197654

2、關閉事務(數據太長不全貼了)

插入1000W數據共耗時:200540

還是沒很大的差距~

借用:

472d2308-d14a-11ed-bfe3-dac502259ad0.png

分別是:

不用批處理,不用事務;

只用批處理,不用事務;

只用事務,不用批處理;

既用事務,也用批處理;(很明顯,這個最快,所以建議在處理大批量的數據時,同時使用批處理和事務)






審核編輯:劉清

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

    關注

    19

    文章

    2973

    瀏覽量

    104872
  • SQL
    SQL
    +關注

    關注

    1

    文章

    768

    瀏覽量

    44177
  • JDBC
    +關注

    關注

    0

    文章

    25

    瀏覽量

    13414
  • MYSQL數據庫
    +關注

    關注

    0

    文章

    96

    瀏覽量

    9414

原文標題:1億條數據批量插入 MySQL,哪種方式最快?

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

收藏 人收藏

    評論

    相關推薦

    利用JAVAMysql插入一億數量級數據—效率測評

    所以通過隨機生成人的姓名、年齡、性別、電話、email、地址 ,mysql數據庫大量插入數據,便于用大量的
    的頭像 發表于 05-24 11:13 ?3335次閱讀

    使用tina測量opa227的輸入失調電壓和失調電流,結果數量級和手冊標準值差很多,為什么?

    使用tina測量opa227的輸入失調電壓和失調電流,發現結果數量級和手冊標準值差很多,這兩個參數的測量電路用得都是書上的參考電路,不知道什么地方出了問題,麻煩各位幫忙看看,謝過! 電路和測量數據在附件中。
    發表于 09-14 07:59

    0基礎學Mysql:mysql入門視頻教程!

    互聯網行業的高速發展,各個中小企業的數據庫存放的數據,也已經達到了一個相當高的數量級。學習目標:深入理解MySQL數據庫的原理從硬件 系統
    發表于 07-08 10:51

    labview的采樣率上限數量級是10^6嗎?

    這意味著labview的采樣率上限數量級是10^6嗎?
    發表于 09-28 13:05

    使用Matlab捕獲N9010A跟蹤數據縮放了幾個數量級

    與顯示類似,并且縮放了幾個數量級。我必須有數據轉換問題,但我無法弄清楚我做錯了什么。使用下面的相關代碼以32位整數格式捕獲數據:+%通過GPIB連接到N9010A信號分析器+ + obj = gpib
    發表于 11-05 10:42

    請問AD9361跳頻穩定時間是一個什么數量級

    我看AD9361的UG上面有關于RF DC OFFSET的矯正時間計算公式,但是還是不太清楚。請問當跳頻范圍超過100M時,RF DC offset 跟跳頻范圍相關的時間在一個什么數量級呢,AD9361在GHz跳頻的時候總共需要的矯正時間是一個什么數量級呢,謝謝
    發表于 02-15 14:39

    開關電源的NTC阻值一般是什么數量級的?

    ACDC開關電源的整流橋后串接的NTC,應是防止冷啟時的浪涌電流的吧。1、用在此處的NTC的阻值一般是何種數量級的?2、看一國外客戶使用的是EPCOS的用于測溫用途的NTC(25攝氏度阻值為1K,B
    發表于 10-09 07:35

    labview插入數據MySQL數據

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

    如何實現處理器的速度跟外圍硬件設備的速度在一個數量級上呢

    0 前言眾所周知,處理器的速度跟外圍硬件設備的速度往往不在一個數量級上,因此,如果內核采取讓處理器硬件發出一個請求,然后專門等待回應的辦法,顯然降低內核效率。既然硬件的響應這么慢,那么內核就應該
    發表于 02-11 07:03

    深度剖析OpenHarmony輕量級數據存儲

    一、輕量級數據存儲的版本openharmony的輕量級數據存儲現有兩個版本,但是harmonyOS的官網上只有一個輕量級數據存儲。二、應用目錄的獲取數據存儲需要獲取到應用的存放目錄,便
    發表于 03-31 14:45

    中國電子系統2天時間建設蘇州市疫情管控平臺 可同時支持10萬數量級企業及1000萬數量級員工的活動軌跡分析

    飛騰公司發布信息稱,他們研發的16nm 64核FT -2000+/64處理器已經用于蘇州疫情管控平臺,只用2天時間就搭建出一套能夠滿足10萬+企業、1000萬數量級員工的平臺。
    的頭像 發表于 03-03 15:12 ?3747次閱讀

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

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

    TinyDB輕量級數據庫有哪些特點呢

    TinyDB 是一個純 Python 編寫的輕量級數據庫,一共只有1800行代碼,沒有外部依賴項。
    的頭像 發表于 10-28 14:07 ?1493次閱讀

    量級數據庫有哪些

    量級數據庫有哪些 隨著互聯網和物聯網等新一代信息技術的廣泛應用,數據庫系統也變得越來越重要。人們對于數據數據庫的可靠性、安全性和性能等要求也越來越高。與傳統的關系型
    的頭像 發表于 08-28 16:41 ?5987次閱讀

    如何在不受電線等的影響下盡可能準確地測量如mΩ數量級的電阻值呢?

    如何在不受電線等的影響下盡可能準確地測量如mΩ數量級的電阻值呢? 引言: 電阻測量是電路分析和電子工程中非常重要的技術。然而,在測量低阻值時,電線、接觸電阻、溫度等因素可能對結果產生較大的影響。因此
    的頭像 發表于 11-17 14:48 ?562次閱讀
    博必发百家乐官网的玩法技巧和规则 | 足球百家乐系统| 百家乐官网开户送18元| 百家乐信誉平台现金投注| 狮威百家乐娱乐网| 辽宁棋牌游戏大厅| 太阳百家乐官网管理网| 真人娱乐城源码| 新加坡百家乐官网规则| bet365主页器| 24山向阴阳图| 皇冠网址推介| 百家乐娱乐注册就送| 越西县| 可以玩百家乐的博彩网站| 赌百家乐官网的高手| 哪个百家乐网站信誉好| 百家乐官网视频游戏注册| 免费百家乐计划软件| 百家乐官网扎金花斗地主| 顶级赌场怎么样| 百家乐庄闲作千| 桂平市| 专业的百家乐玩家| 百家乐官网推筒子| 大发888玩法| 百家乐官网手论坛48491| bet365扑克| 百家乐赌机凤凰软件| 百家乐官网最佳投注法下载| 百家乐软件| 宝龙百家乐官网的玩法技巧和规则 | 百家乐官网高| 真人赌钱| 百家乐赌场赌场平台| 百家乐官网八卦投注法| 大发888游戏平台hanpa| 杨公24山分金兼向吉凶| 百家乐官网有多少局| 东方太阳城二手房| 百家乐官网翻天|