日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java要从数据查出五百多万条数据_100w条数据 | 插入Mysql你要用多长时间?

發布時間:2025/3/21 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java要从数据查出五百多万条数据_100w条数据 | 插入Mysql你要用多长时间? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大數據技術與架構點擊右側關注,大數據開發領域最強公眾號!

暴走大數據點擊右側關注,暴走大數據!

目錄

1、多線程插入(單表)2、多線程插入(多表)3、預處理SQL4、多值插入SQL5、事務(N條提交一次)

多線程插入(單表)

問:為何對同一個表的插入多線程會比單線程快?同一時間對一個表的寫操作不應該是獨占的嗎?

答:在數據里做插入操作的時候,整體時間的分配是這樣的:

1、多鏈接耗時 (30%)?

2、多發送query到服務器 (20%)?

3、多解析query (20%)?

4、多插入操作 (10% * 詞條數目)?

5、多插入index (10% * Index的數目)

6、多關閉鏈接 (10%)

從這里可以看出來,真正耗時的不是操作,而是鏈接,解析的過程。

MySQL插入數據在寫階段是獨占的,但是插入一條數據仍然需要解析、計算、最后才進行寫處理,比如要給每一條記錄分配自增id,校驗主鍵唯一鍵屬性,或者其他一些邏輯處理,都是需要計算的,所以說多線程能夠提高效率。

多線程插入(多表)

分區分表后使用多線程插入。

預處理SQL

普通SQL即使用Statement接口執行SQL預處理SQL即使用PreparedStatement接口執行SQL

使用PreparedStatement接口允許數據庫預編譯SQL語句,以后只需傳入參數,避免了數據庫每次都編譯SQL語句,因此性能更好。

String sql = "insert into testdb.tuser (name, remark, createtime, updatetime) values (?, ?, ?, ?)";

for(int i = 0; i < m; i++) {

//從池中獲取連接

Connection conn = myBroker.getConnection();

PreparedStatement pstmt = conn.prepareStatement(sql);

for(int k = 0; k < n; k++) {

pstmt.setString(1, RandomToolkit.generateString(12));

pstmt.setString(2, RandomToolkit.generateString(24));

pstmt.setDate(3, newDate(System.currentTimeMillis()));

pstmt.setDate(4, newDate(System.currentTimeMillis()));

//加入批處理

pstmt.addBatch();

}

pstmt.executeBatch(); //執行批處理

pstmt.close();

myBroker.freeConnection(conn); //連接歸池

}

多值插入SQL

普通插入SQL:INSERT INTO TBL_TEST (id) VALUES(1)多值插入SQL:INSERT INTO TBL_TEST (id) VALUES (1), (2), (3)

使用多值插入SQL,SQL語句的總長度減少,即減少了網絡IO,同時也降低了連接次數,數據庫一次SQL解析,能夠插入多條數據。

事務(N條提交一次)

在一個事務中提交大量INSERT語句可以提高性能。

1、將表的存儲引擎修改為myisam 2、將 sql 拼接成字符串,每 1000 條左右提交事務。

  • 執行多條SQL語句,實現數據庫事務。??

  • mysql數據庫??

  • 多條SQL語句

public?void?ExecuteSqlTran(List?SQLStringList)

{

????using?(MySqlConnection?conn?=?new?MySqlConnection(connectionString))

????{

????????if?(DBVariable.flag)

????????{

????????????conn.Open();

????????????MySqlCommand?cmd?=?new?MySqlCommand();

????????????cmd.Connection?=?conn;

????????????MySqlTransaction?tx?=?conn.BeginTransaction();

????????????cmd.Transaction?=?tx;

????????????try

????????????{

????????????????for?(int?n?=?0;?n?SQLStringList.Count;?n++)

????????????????{

????????????????????string?strsql?=?SQLStringList[n].ToString();

????????????????????if?(strsql.Trim().Length?>?1)

????????????????????{

????????????????????????cmd.CommandText?=?strsql;

????????????????????????cmd.ExecuteNonQuery();

????????????????????}

????????????????????//后來加上的??

????????????????????if?(n?>?0?&&?(n?%?1000?==?0?||?n?==?SQLStringList.Count?-?1))

????????????????????{

????????????????????????tx.Commit();

????????????????????????tx?=?conn.BeginTransaction();

????????????????????}

????????????????}

????????????????//tx.Commit();//原來一次性提交??

????????????}

????????????catch?(System.Data.SqlClient.SqlException?E)

????????????{

????????????????tx.Rollback();

????????????????throw?new?Exception(E.Message);

????????????}

????????}

????}

}

10w條數據大概用時10s!

原文:https://blog.csdn.net/qq_36691683/article/details/89297261

參考資料:

https://www.cnblogs.com/aicro/p/3851434.html

http://blog.jobbole.com/29432/

歡迎點贊+收藏+轉發朋友圈素質三連

文章不錯?點個【在看】吧!??

總結

以上是生活随笔為你收集整理的java要从数据查出五百多万条数据_100w条数据 | 插入Mysql你要用多长时间?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。