處理多執行緒插入的正確方法是什麼
我是數據庫的新手,現在我需要使用 MySQL 來建構 Web 伺服器。
總之,我有一個用 Python 開發的 web 框架。它將從/向 MySQL 讀取/寫入數據。
現在我不知道如何處理 multithreading 的情況
insert
。假設有很多使用者正在將他們的數據寫入一張表中。我會使用一個執行緒池來處理這些請求,也就是說同時會有多個
insert
s。我的問題是:
如果我設置了
concurrent_insert=2
,multipleinsert
-s 是否仍然會導致 table 的鎖定,這樣我會得到一個非常糟糕的性能(所有的insert
s 都必須一個一個處理)?或者 MySQL 本身可以insert
正確處理倍數,因此我可以獲得不錯的性能?對於倍數,“共享一個連接對象”和“每個都有自己的連接對象”
insert
有什麼區別嗎?insert
沒做什麼。
說真的,MySQL 被設計為預設提供並發性。它可以處理各種可能發生的“衝突”。
MySQL 支持多個“引擎”。除非您使用的是舊版本,否則預設為
ENGINE=InnoDB
. (參見CREATE TABLE
。)concurrent_insert
與舊的、已棄用的、ENGINE=MyISAM
;不要使用那個引擎。您應該始終做一件事:在執行 SQL 語句後檢查錯誤。(這可以通過“try…catch”來完成。)如果沒有別的,用錯誤消息中止,這樣錯誤就不會被忽視——這可能很難調試。
一個功能齊全的網站甚至不需要“執行緒池”。(如果您的網站變得非常受歡迎,這可能很重要。)
正常的 Web 使用情況是:為一個想要一個網頁的使用者啟動一個程序。然後它應該有一個與 MySQL 的連接。時期。(這是否解決了您的“共享一個連接對象”?)當另一個使用者打開同一個網頁時,網路伺服器會啟動另一個 python 副本,它將與 MySQL 建立單獨的連接。