我正在寫(xiě)一個(gè)與海量資料獲取相關(guān)的項(xiàng)目。 目前我使用.NET Framework 4.8和Mysql包來(lái)啟動(dòng)連線(xiàn)並向資料庫(kù)伺服器插入資料。
我將插入大約 400, 000 行/秒。 我擔(dān)心 SQL 連線(xiàn)可能成為我的程式的瓶頸。 我想知道如果我使用 sql 創(chuàng)建多線(xiàn)程連接並使用消費(fèi)者隊(duì)列插入數(shù)據(jù),它會(huì)更快並且值得嗎(優(yōu)點(diǎn)和缺點(diǎn))?
在我的直覺(jué)中,它會(huì)更快,但我不確定它可以在執(zhí)行緒開(kāi)銷(xiāo)方面提供多少效能。我不是 SQL 專(zhuān)家,因此如果有人能夠解釋在多個(gè)執(zhí)行緒上開(kāi)啟與 SQL 的多個(gè)連線(xiàn)的優(yōu)缺點(diǎn),那就太好了。
謠言、觀點(diǎn)、道聽(tīng)途說(shuō)、事實(shí)、版本相關(guān)的基準(zhǔn)、一些個(gè)人經(jīng)驗(yàn)等...
多執(zhí)行緒可以提高吞吐量,但也有限制:
批次:
LOAD DATA
是一次從單一執(zhí)行緒 INSERT
大量行的最快方法。但是,如果您包含將檔案寫(xiě)入 LOAD
的成本,則可能會(huì)使其比批次插入慢。 INSERT
緊跟在後。但當(dāng)達(dá)到某個(gè)限製或「收益遞減」時(shí),它的上限為「數(shù)百」行。 INSERT
查詢(xún)插入一行的速度的 10 倍。因此,它(或 LOAD DATA
)值得用於高速攝取。 (來(lái)源:許多不同的定時(shí)測(cè)試。)資料來(lái)源:
載入資料後會(huì)發(fā)生什麼事?當(dāng)然,這不是一個(gè)只寫(xiě)不讀的表。
PARTITIONing
很少有用,除了最終清除舊資料之外。請(qǐng)參閱分割區(qū)