mysql大批量插入數(shù)據(jù)的正確解決方法
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é)果:
結(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)文章
MySQL千萬數(shù)據(jù)量深分頁優(yōu)化流程(拒絕線上故障)
這篇文章主要為大家介紹了MySQL千萬數(shù)據(jù)量深分頁優(yōu)化拒絕線上故障,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程
這篇文章主要介紹了在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程,子查詢的使用時MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-12-12MySQL?聚合函數(shù)、分組查詢、時間函數(shù)詳解
這篇文章主要介紹了MySQL?聚合函數(shù)、分組查詢、時間函數(shù)?,主要考驗聚合函數(shù)count()求和以及分組查詢,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2024-08-08Linux系統(tǒng)下修改mysql字符集為UTF8步驟
大家好,本篇文章主要分享的是Linux系統(tǒng)下修改mysql字符集為UTF8步驟,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下吧,方便下次瀏覽2021-12-12MySQL學(xué)習(xí)必備條件查詢數(shù)據(jù)
這篇文章主要介紹了MySQL學(xué)習(xí)必備條件查詢數(shù)據(jù),首先通過利用where語句可以對數(shù)據(jù)進行篩選展開主題相關(guān)內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你有所幫助2022-03-03