最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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語句插入100條數(shù)據(jù),批處理每次發(fā)送1000條這樣的數(shù)據(jù),共循環(huán)100次即可。? 理論上來說,批處理操作不建議一次性超過【5000】,每條SQL語句根據(jù)具體需求調(diào)整,不建議超過【100】,可以調(diào)整循環(huán)次數(shù)來改善效率。

下面為測試代碼:

1.1 測試普通插入

@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("共耗時:" + time +"秒")
}

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

在這里插入圖片描述

1.2 測試批處理配合拼接SQL語句插入

@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("共耗時:" + time +"秒");
}

測試結(jié)果:

img

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

2 原理探究

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

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

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

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

相關(guān)文章

  • CentOS7下mysql 8.0.16 安裝配置方法圖文教程

    CentOS7下mysql 8.0.16 安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了CentOS7下mysql 8.0.16 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • MySQL數(shù)據(jù)庫改名的詳細方法教程

    MySQL數(shù)據(jù)庫改名的詳細方法教程

    在很多人看來Oracle數(shù)據(jù)庫一旦建好后,數(shù)據(jù)庫的名字就不能改變了,其實不然,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫改名的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • MYSQL表分區(qū)的實現(xiàn)示例

    MYSQL表分區(qū)的實現(xiàn)示例

    表分區(qū)是將表中的數(shù)據(jù)按照某種規(guī)則分散存儲到多個分區(qū)中,每個分區(qū)可以獨立地進行操作,例如查詢、插入、更新和刪除,下面就來介紹一下MYSQL表分區(qū)的實現(xiàn)
    2025-09-09
  • mysql分區(qū)表學(xué)習(xí)之日期分區(qū)

    mysql分區(qū)表學(xué)習(xí)之日期分區(qū)

    這篇文章主要給大家介紹了關(guān)于mysql分區(qū)表學(xué)習(xí)之日期分區(qū)的相關(guān)資料,分區(qū)是一種表的設(shè)計模式,通俗地講表分區(qū)是將一大表,根據(jù)條件分割成若干個小表,需要的朋友可以參考下
    2023-08-08
  • 詳解MySQL如何交換兩列值數(shù)據(jù)

    詳解MySQL如何交換兩列值數(shù)據(jù)

    最近遇到了需要將表里的兩列值進行互換,原因是存庫時值存放反了,在編碼語言中,我們一般可以通過定義一個臨時變量c,將b賦值給c,a賦值給b,c賦值給a就能實現(xiàn)a和b的值互換,那么,在mysql中,非儲存過程的sql語句,沒有定義變量的過程,如何實現(xiàn)呢,接下來由小編給大家介紹一下
    2024-01-01
  • MySQL rownumber SQL生成自增長序號使用介紹

    MySQL rownumber SQL生成自增長序號使用介紹

    MySQL 幾乎模擬了 Oracle,SQL Server等商業(yè)數(shù)據(jù)庫的大部分功能,函數(shù)。但很可惜,到目前的版本(5.1.33)為止,仍沒有實現(xiàn)ROWNUM這個功能
    2011-10-10
  • Mysql5 字符集編碼問題解決

    Mysql5 字符集編碼問題解決

    mysql 創(chuàng)建 數(shù)據(jù)庫時指定編碼很重要,很多開發(fā)者都使用了默認編碼,但是我使用的經(jīng)驗來看,制定數(shù)據(jù)庫的編碼可以很大程度上避免倒入導(dǎo)出帶來的亂碼問題。
    2009-10-10
  • MySQL中處理大數(shù)據(jù)表的3種方案的實現(xiàn)與對比

    MySQL中處理大數(shù)據(jù)表的3種方案的實現(xiàn)與對比

    這篇文章主要為大家詳細介紹了MySQL中處理大數(shù)據(jù)表的3種方案的實現(xiàn)與對比,文中的示例代碼講解詳細,有需要的小伙伴可以根據(jù)需要進行選擇
    2025-10-10
  • MySQL運行報錯:“Expression?#1?of?SELECT?list?is?not?in?GROUP?BY?clause?and?contains?nonaggre”解決方法

    MySQL運行報錯:“Expression?#1?of?SELECT?list?is?not?in?GR

    這篇文章主要給大家介紹了關(guān)于MySQL運行報錯:“Expression?#1?of?SELECT?list?is?not?in?GROUP?BY?clause?and?contains?nonaggre”的解決方法,文中將解決方法介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 詳解MySQL的內(nèi)連接和外連接

    詳解MySQL的內(nèi)連接和外連接

    這篇文章主要介紹了詳解MySQL的內(nèi)連接和外連接,mySQL包含兩種聯(lián)接,分別是內(nèi)連接(inner join)和外連接(out join),但我們又同時聽說過左連接,交叉連接等術(shù)語,本文就帶大家來了解一下,需要的朋友可以參考下
    2023-05-05

最新評論

双江| 新河县| 沙田区| 兰考县| 黄平县| 新密市| 临汾市| 大洼县| 淮滨县| 贡觉县| 济源市| 红原县| 高平市| 图们市| 西充县| 潞西市| 谢通门县| 秀山| 蛟河市| 长春市| 石渠县| 丰都县| 乐昌市| 明光市| 普陀区| 电白县| 万盛区| 株洲市| 抚州市| 克什克腾旗| 林甸县| 乌审旗| 玉树县| 黄冈市| 宁城县| 临夏县| 赣州市| 兴海县| 哈巴河县| 冕宁县| 留坝县|