欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql大批量插入數(shù)據(jù)的正確解決方法

 更新時(shí)間:2023年09月18日 09:35:18   作者:趙廣陸  
這篇文章主要介紹了mysql大批量插入數(shù)據(jù)的正確做法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1 批量插入和單條插入比較

如何快速的向數(shù)據(jù)庫(kù)中插入已知的1000萬條數(shù)據(jù)

? 假設(shè)這1000W條數(shù)據(jù)在同一個(gè)集合里,那么將這個(gè)集合進(jìn)行遍歷,循環(huán)1000W次,結(jié)合數(shù)據(jù)庫(kù)編程技術(shù),如JDBC,就可以插入數(shù)據(jù)庫(kù),這么簡(jiǎn)單的操作,顯然不是正確答案…

List<User> list = findAllUser();
Statement stat = conn.createStatement();
for (User u : list) {
	String sql = "INSERT INTO t_user (uname,age,email) VALUE ('"
                  +u.getUsername()+"',"+u.getAge()+",'"+u.getEmail()+"')";
	stat.addBatch(sql);
}
stat.executeBatch();
INSERT INTO t_user
      (uname,upwd,age,email)
VALUE 
      ('root1','123456',15,'root111@qq.com'),
      ('root2','123456',18,'root222@qq.com'),
      ('root3','123456',26,'root333@qq.com'),
      ....

? 當(dāng)兩種方法配合使用,可以使用每條SQL語(yǔ)句插入100條數(shù)據(jù),批處理每次發(fā)送1000條這樣的數(shù)據(jù),共循環(huán)100次即可。? 理論上來說,批處理操作不建議一次性超過【5000】,每條SQL語(yǔ)句根據(jù)具體需求調(diào)整,不建議超過【100】,可以調(diào)整循環(huán)次數(shù)來改善效率。

下面為測(cè)試代碼:

1.1 測(cè)試普通插入

@Test
public void testInsert() {
	UserDAO dao = new UserDAO();
	long t1 = System.currentTimeMillis();
	for(int i=0;i<10000000;i++) {
	    dao.insert(
                "INSERT INTO t_user (uname,pwd,age,email) VALUES ('root','123',15,'root@qq.com')");
	}
	long t2 = System.currentTimeMillis();
	int time = (int) ((t2-t1)/1000);
	System.out.println("共耗時(shí):" + time +"秒")
}

測(cè)試結(jié)果:在嘗試了幾次,都被各種意外打斷之后,我決定沒有必要把數(shù)據(jù)全部插完,因?yàn)閷?shí)在是太多了,不多說,上圖吧

在這里插入圖片描述

1.2 測(cè)試批處理配合拼接SQL語(yǔ)句插入

@Test
public void testBatch() throws SQLException {
	Connection conn = DBUtils.getConn();
	Statement stat = conn.createStatement();
long t1 = System.currentTimeMillis();
	for(int k=0;k<100;k++) {
	for (int i=0;i<1000;i++) {
			StringBuilder sql =new StringBuilder();
			sql.append("INSERT INTO t_user (uname,pwd,age,email) VALUES ");
			for (int j = 0; j < 100; j++) {				sql.append("('root','123',15,'root@qq.com'),");
			}
			stat.addBatch(sql.toString().substring(0,sql.lastIndexOf(",")))
		}
		stat.executeBatch();
	}
	long t2 = System.currentTimeMillis();
	int time = (int) ((t2-t1)/1000);
	System.out.println("共耗時(shí):" + time +"秒");
}

測(cè)試結(jié)果:

img

結(jié)果顯而易見了:第二種方案的執(zhí)行效率遠(yuǎn)高于普通插入方法,不過,具體運(yùn)行時(shí)間和電腦配置應(yīng)該也有關(guān)系的,所以不用糾結(jié)時(shí)間長(zhǎng)短,還是會(huì)用高效的方法就好了。

2 原理探究

應(yīng)用服務(wù)器(程序運(yùn)行所在服務(wù)器)與MySQL數(shù)據(jù)庫(kù)服務(wù)器并不是同一臺(tái),當(dāng)需要執(zhí)行數(shù)據(jù)庫(kù)操作時(shí),會(huì)由應(yīng)用服務(wù)器將SQL語(yǔ)句發(fā)送到MySQL數(shù)據(jù)庫(kù)服務(wù)器,發(fā)送過程中就需要建立網(wǎng)絡(luò)連接,才可以發(fā)送SQL語(yǔ)句,則總共需要連接1000W次,效率極低。

同時(shí),每次執(zhí)行SQL語(yǔ)句之前,MySQL服務(wù)器還會(huì)對(duì)SQL語(yǔ)句進(jìn)行語(yǔ)法分析,語(yǔ)義分析,編譯檢查等才可以執(zhí)行,假設(shè)最終有1000W條SQL語(yǔ)句,則這些過程需要耗費(fèi)大量時(shí)間。針對(duì)這個(gè)缺陷,

可以使用【批處理】解決,減少連接數(shù)據(jù)庫(kù)的次數(shù),同時(shí)將單條插入語(yǔ)句改為一次插入多條數(shù)據(jù)以提高效率。

到此這篇關(guān)于mysql大批量插入數(shù)據(jù)的正確做法的文章就介紹到這了,更多相關(guān)mysql大批量插入數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL千萬數(shù)據(jù)量深分頁(yè)優(yōu)化流程(拒絕線上故障)

    MySQL千萬數(shù)據(jù)量深分頁(yè)優(yōu)化流程(拒絕線上故障)

    這篇文章主要為大家介紹了MySQL千萬數(shù)據(jù)量深分頁(yè)優(yōu)化拒絕線上故障,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • MySQL使用命令備份和還原數(shù)據(jù)庫(kù)

    MySQL使用命令備份和還原數(shù)據(jù)庫(kù)

    這篇文章主要介紹了MySQL使用命令備份和還原數(shù)據(jù)庫(kù),本文使用Mysql內(nèi)置命令實(shí)現(xiàn)備份和還原,比較簡(jiǎn)單,需要的朋友可以參考下
    2015-01-01
  • 在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程

    在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程

    這篇文章主要介紹了在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程,子查詢的使用時(shí)MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-12-12
  • mysq啟動(dòng)失敗問題及場(chǎng)景分析

    mysq啟動(dòng)失敗問題及場(chǎng)景分析

    這篇文章主要介紹了mysq啟動(dòng)失敗問題及解決方法,通過問題分析定位特殊場(chǎng)景解析給大家?guī)硗昝澜鉀Q方案,需要的朋友可以參考下
    2021-07-07
  • MySQL?聚合函數(shù)、分組查詢、時(shí)間函數(shù)詳解

    MySQL?聚合函數(shù)、分組查詢、時(shí)間函數(shù)詳解

    這篇文章主要介紹了MySQL?聚合函數(shù)、分組查詢、時(shí)間函數(shù)?,主要考驗(yàn)聚合函數(shù)count()求和以及分組查詢,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Linux系統(tǒng)下修改mysql字符集為UTF8步驟

    Linux系統(tǒng)下修改mysql字符集為UTF8步驟

    大家好,本篇文章主要分享的是Linux系統(tǒng)下修改mysql字符集為UTF8步驟,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下吧,方便下次瀏覽
    2021-12-12
  • mysql刪除表數(shù)據(jù)如何恢復(fù)

    mysql刪除表數(shù)據(jù)如何恢復(fù)

    這篇文章主要介紹了mysql刪除表數(shù)據(jù)如何恢復(fù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • MySQL學(xué)習(xí)必備條件查詢數(shù)據(jù)

    MySQL學(xué)習(xí)必備條件查詢數(shù)據(jù)

    這篇文章主要介紹了MySQL學(xué)習(xí)必備條件查詢數(shù)據(jù),首先通過利用where語(yǔ)句可以對(duì)數(shù)據(jù)進(jìn)行篩選展開主題相關(guān)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-03-03
  • mysql 觸發(fā)器用法實(shí)例詳解

    mysql 觸發(fā)器用法實(shí)例詳解

    這篇文章主要介紹了mysql 觸發(fā)器用法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • MySQL中去重處理的方法小結(jié)

    MySQL中去重處理的方法小結(jié)

    本文主要介紹了MySQL中去重方法小結(jié),包含DISTINCT、GROUPBY、聚合函數(shù)、子查詢、臨時(shí)表、窗口函數(shù)、GROUP_CONCAT這些方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11

最新評(píng)論