MySql/MariaDb 每秒大約可以容忍多少次讀/寫?
我正在執行一個 python 腳本,它讀取一些歷史數據並將其插入 MariaDb。有很多數據,我考慮將其拆分為多個部分並執行腳本的多個實例。
但是由於腳本的單個實例已經以高速讀取和寫入 Db,在我看來,我想知道:MariaDb 平均每秒可以容忍多少次讀取/寫入?
如果我創建更多腳本實例會發生什麼?MariaDb 會以某種方式崩潰嗎?或者它會簡單地放慢一點但最終正確處理所有數據?
如何評估每秒是否有太多數據?
$ mysql --version mysql Ver 15.1 Distrib 10.5.15-MariaDB,
這取決於。
HDD,一次寫入一行——100 行/秒。
SSD 加上下面的一些提示 - 10K 行/秒。
對於寫:
- SSD 可能比 HDD 快 10 倍。
- 在單個 INSERT 語句中批處理 100 行比一次一行快 10 倍。(
executemany
)- 多個連接(程序)可以獲得一些並行性,對於 10 個執行緒,可能高達 5 倍。
LOAD DATA
可以比上述任何一點更快地處理 CSV 文件——當然比在應用程序中讀取 csv、解析它、建構查詢(甚至是批處理)、將其發送到 MySQL/MariaDB、讓它解析等更好。- 多個二級索引,尤其是在一定程度上
UNIQUE
減慢了任何一個。INSERT
對於閱讀:
讀取速度更快——鎖定更少等。一些速度提示:
- 擁有足夠大的 buffer_pool 來記憶體所有數據——也許是 10 倍的加速。
- 不使用 UUID。
- 多個連接,特別是如果不阻塞同一個表上的寫入。
- 多行讀取
- 更少的往返(例如,不要
SELECT
id,然後轉身並SELECT
使用這些 id。)- 在 SQL 中聚合,而不是在應用程序中。(也就是說,當工作可以在數據庫中完成時,不要將大量數據鏟到應用程序中。)
- 讓應用程序和數據庫在地理位置上“更接近”。(回复:網路延遲)
讀取和寫入:
注意死鎖和“鎖定等待超時”。特別是,如果你不抓住這些並處理它們,你可能會“失去”數據。(相反,重播交易等)
通常,更多的連接會導致完成更多的工作。然而,在“幾十個”連接之後,吞吐量停滯不前,延遲達到頂峰。
對於“連續”高速攝取:http: //mysql.rjweb.org/doc.php/staging_table
很忙
當“太多”發生時,所有執行緒都會執行得更慢——等待它們共享的 I/O 或 CPU 或記憶體空間或其他任何東西。
有多種超時。當這種情況發生時,特定的操作(
INSERT
,交易等)將中止。您應該注意錯誤,以便您可以採取某種恢復操作,否則活動就會失去。當事情變得太忙時,MySQL(和伺服器)不太可能“崩潰”。
至於讀取與寫入——它們都在爭奪資源(I/O、CPU 等);一個可能會比其他延遲更多;很難預測哪個程序更有可能超時。
DBA 應該辨識最慢的查詢並尋找加速(或避免)這些查詢的特定方法,從而為所有程序釋放資源。
一個常見的情況是使用
mysqldump
每晚備份所有數據。典型設置將鎖定一個表足夠長的時間,以便對該表的寫入抱怨和超時。還有其他方法可以進行備份;可能有辦法在晚上的那個時候避免這樣的寫入;等等