我正在撰寫一個與海量資料獲取相關的專案。目前我正在使用 .NET Framework 4.8 和 Mysql 包來啟動連接并將資料插入資料庫服務器。
我將插入大約 400, 000 行/秒。我擔心 SQL 連接可能會成為我程式的瓶頸。我想知道如果我用 sql 創建一個多執行緒連接并使用消費者佇列插入資料,它會更快,是否值得(優點和缺點)?
在我的直覺中,它會更快,但我不確定它在執行緒開銷方面可以提供多少性能。我不是 SQL 專家,所以如果有人能解釋在多個執行緒上打開多個 SQL 連接的優缺點,那就太好了。
uj5u.com熱心網友回復:
謠言、觀點、傳聞、事實、版本相關的基準、一些個人經驗等……
多執行緒將提高吞吐量,但有限制:
- 吞吐量被限制在理論限制的一半左右。(你的“一定百分比”)(這是基于多執行緒包的基準;我忘記了名字;那是十年前的事了。)
- 多個執行緒將通過互斥鎖和其他必要的鎖定機制相互競爭。
- 在 5.7 左右,64 個執行緒是 MySQL 對多執行緒的限制;在此之上,吞吐量停滯甚至下降。(來源:許多 Oracle 基準測驗吹噓一個版本比前一個版本好多少。)(同時,每個執行緒的延遲都達到了頂峰。)
- 如果可能,每個執行緒都應該批處理資料。
批處理:
LOAD DATAINSERT是一次從單個執行緒獲取大量行的最快方法。但是,如果您包括將檔案寫入 的成本LOAD,這可能會使其實際上比批量插入慢。- 批處理緊隨其后
INSERT。但是,當它達到某個限制或“收益遞減”時,它會限制在“數百”行。 INSERT批量插入的速度是每次查詢插入一行的 10 倍。所以它(或LOAD DATA)值得用于高速攝取。(來源:許多不同的定時測驗。)
資料來源:
- 一些資料源必須一次只提供一行(例如,每 N 秒來自車輛的傳感器資料)。這要求某個中間層對資料進行批處理。
- 收集資料的討論:http: //mysql.rjweb.org/doc.php/staging_table
加載資料后會發生什么?當然,這不是一個只寫永不讀的表。
- 規范化對于縮小磁盤占用空間很有用;這最好分批完成。見歸一化
PARTITIONing很少有用,除了最終清除舊資料。見磁區- 一個巨大的“事實”表很難搜索;考慮在攝取資料時構建摘要資料:摘要表
- 甚至可以進行上述處理,然后折騰原始資料。聽起來您每天可能會獲取 1 TB 的資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/497255.html
上一篇:無法創建其中兩個屬性是另一個物體的Id和另一個物體的Id的ArrayList的物體
下一篇:如何跟蹤資料庫中的“條紋”?
