閱讀本文需要5分鐘
目錄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
普通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
普通插入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(listsqlstringlist)
//後來加上的
if (n >
0 && (n %
1000
== 0 || n ==
sqlstringlist
.count
- 1))
}原來一次性提交
}catch
(system
.data
.sqlclient
.sqlexception
e) }}
}
10w條資料大概用時10s! MySQL資料庫插入100w條資料要花多久時間?
1 多執行緒插入 單錶 2 多執行緒插入 多表 3 預處理sql 4 多值插入sql 5 事務 n條提交一次 問 為何對同乙個表的插入多執行緒會比單執行緒快?同一時間對乙個表的寫操作不應該是獨佔的嗎?答 在資料裡做插入操作的時候,整體時間的分配是這樣的 1 多鏈結耗時 30 2 多傳送query到伺...
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...