建立多個資料庫連線進行SQL插入有好處嗎?
P粉585541766
P粉585541766 2024-03-30 08:39:46
0
1
205

我正在寫一個與海量資料獲取相關的項目。 目前我使用.NET Framework 4.8和Mysql包來啟動連線並向資料庫伺服器插入資料。

我將插入大約 400, 000 行/秒。 我擔心 SQL 連線可能成為我的程式的瓶頸。 我想知道如果我使用 sql 創建多線程連接並使用消費者隊列插入數據,它會更快並且值得嗎(優點和缺點)?

在我的直覺中,它會更快,但我不確定它可以在執行緒開銷方面提供多少效能。我不是 SQL 專家,因此如果有人能夠解釋在多個執行緒上開啟與 SQL 的多個連線的優缺點,那就太好了。

P粉585541766
P粉585541766

全部回覆(1)
P粉373596828

謠言、觀點、道聽途說、事實、版本相關的基準、一些個人經驗等...

多執行緒可以提高吞吐量,但也有限制:

  • 吞吐量上限約為理論極限的一半。 (你的“一定百分比”)(這是基於多線程包的基準;我忘記了名字;那是十年前的事了。)
  • 多個執行緒將在互斥體和其他必要的鎖定機制上相互競爭。
  • 從大約 5.7 開始,64 個執行緒是 MySQL 的多執行緒限制;超過這個值,吞吐量就會停滯甚至下降。 (來源:許多 Oracle 基準測試都吹噓一個版本比前一個版本好得多。)(同時,每個執行緒的延遲都達到了頂峰。)
  • 如果可能,每個執行緒都應批次處理資料。

批次:

  • LOAD DATA 是一次從單一執行緒 INSERT 大量行的最快方法。但是,如果您包含將檔案寫入 LOAD 的成本,則可能會使其比批次插入慢。
  • 批次 INSERT 緊跟在後。但當達到某個限製或「收益遞減」時,它的上限為「數百」行。
  • 批次插入的速度是每次 INSERT 查詢插入一行的速度的 10 倍。因此,它(或 LOAD DATA)值得用於高速攝取。 (來源:許多不同的定時測試。)

資料來源:

載入資料後會發生什麼事?當然,這不是一個只寫不讀的表。

  • 標準化對於縮小磁碟佔用空間很有用;最好分批進行。請參閱標準化
  • PARTITIONing 很少有用,除了最終清除舊資料之外。請參閱分割區
  • 巨大的「事實」表很難搜尋;考慮在攝取資料時建立摘要資料:匯總表
  • 甚至可以進行上述處理,然後丟掉原始資料。聽起來您每天可能會取得一 TB 的資料。
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!