簡體   English   中英

MySQL插入與鎖表寫

[英]MySQL Insert with lock tables write

我們的任務是上傳各種價格表,因此在實現此功能之前,請先快速提問。

如果我想一次插入1000行,例如說100,000行,建議是: http : //dev.mysql.com/doc/refman/5.5/en/optimizing-myisam-bulk-data-loading.html

“如果執行許多連續的插入操作,則可以不時執行一次LOCK TABLES,然后執行一次UNLOCK TABLES(每行1​​,000條左右),以允許其他線程訪問表。這仍將帶來不錯的性能提升。”

顯然,當我在桌子上有“ WRITE LOCK”字樣時,您仍然可以閱讀桌子嗎?

我問的原因是: http : //dev.mysql.com/doc/refman/5.0/en/lock-tables.html說:

只有持有鎖的會話才能訪問該表。 在釋放鎖之前,沒有其他會話可以訪問它

“可以訪問它” ...我的天哪,如果是這樣的話,我們整個系統就會凍結...我們根本無法擁有...實際上是這樣,還是它們的意思是...其他會話可以寫入表,直到釋放鎖為止。”?

最終,我想做的是在不影響系統的情況下插入100,000個簡單的數據行。 我用過:

插入值(1,0.00),(2,0.00),... ...,(999,0.00)

但這經常由於某種原因導致沒有添加行。

如果使用LOCK TABLES ... WRITE鎖定表,則其他線程無法讀取/寫入該表。

最好的方法是使用多行插入語句

INSERT INTO table (f1,f2,f3....) VALUES
(v1,v2,v3...),
(v1,v2,v3...),
...

您可能需要將行分成多條語句,每條語句有1-10K行(可能更多,具體取決於您的max_packet_size和其他設置)。

如果MyISAM插入表中間的空白處,它將鎖定該表。 如果僅在該表上執行插入操作(不刪除操作),則可以通過插入和選擇多個線程來確定。

如果表頻繁刪除/更新,則應考慮切換到InnoDB。

至於“由於某種原因沒有添加行”-幾乎可以肯定的是,您的語句/代碼中的某個地方有錯誤。 該語句將插入行或返回錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM