MySQL資料庫插入100w條資料要花多久時間?

2021-10-04 10:54:53 字數 1591 閱讀 1306

1、多執行緒插入(單錶)

2、多執行緒插入(多表)

3、預處理sql

4、多值插入sql

5、事務(n條提交一次)

問:為何對同乙個表的插入多執行緒會比單執行緒快?同一時間對乙個表的寫操作不應該是獨佔的嗎?

答:在資料裡做插入操作的時候,整體時間的分配是這樣的:

1、多鏈結耗時 (30%)

2、多傳送query到伺服器 (20%)

3、多解析query (20%)

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

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

6、多關閉鏈結 (10%)

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

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

分區分表後使用多執行緒插入。

普通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++

) pstmt.

executebatch()

;//執行批處理

pstmt.

close()

; mybroker.

freeconnection

(conn)

;//連線歸池

}

普通插入sql:insert into tbl_test (id) values(1)

多值插入sql:insert into tbl_test (id) values (1), (2), (3)

使用多值插入sql,sql語句的總長度減少,即減少了網路io,同時也降低了連線次數,資料庫一次sql解析,能夠插入多條資料。

在乙個事務中提交大量insert語句可以提高效能。

1、將表的儲存引擎修改為myisam

2、將 sql 拼接成字串,每 1000 條左右提交事務。

public

void

executesqltran

(list

sqlstringlist)

//後來加上的

if(n >0&&

(n %

1000==0

|| n == sqlstringlist.count -1)

)}原來一次性提交

}catch

(system.data.sqlclient.sqlexception e)}}

}

10w條資料大概用時10s!

MySQL資料庫插入 100w 條資料用了多久?

閱讀本文需要5分鐘 目錄1 多執行緒插入 單錶 2 多執行緒插入 多表 3 預處理sql 4 多值插入sql 5 事務 n條提交一次 多執行緒插入 單錶 問 為何對同乙個表的插入多執行緒會比單執行緒快?同一時間對乙個表的寫操作不應該是獨佔的嗎?答 在資料裡做插入操作的時候,整體時間的分配是這樣的 1...

EXCEL大資料匯出(100W條)

excel匯出,如果說上了數十萬條,那麼走記憶體直接一次性匯出相當的困難,我本地的記憶體調的相對較小,所以大概5 6萬條就不行了,我在createcell加了乙個輸出語句,迴圈到5 6萬條,就會非常非常慢,每次createcell一次,需要5 10s,後面會越來越慢。解決這種事情,一般的解決思路是,...

mysql 聯表查詢 100w 資料優化

閒來無事,使用vue封裝了個table元件,封裝完成後想測試下,資料量小的情況下,能迅速展現資料,資料上了100w後,直接超時,結果一步步排查,發現是sql查詢的問題 使用表 訂單表 order 100w 商品表goods 使用者表 user 未優化前sql查詢語句 select o.order i...