2012-07-23 73 views
1

我該怎麼做總是在不鎖定表的情況下插入MySQL MyISAM數據庫?MySQL MyISAM - Do not insert without lock

當我加載100,000條記錄時,其他進程似乎被鎖定。

基本上,我可以強制使用concurrent_inserts = 2,即使表中有孔,所以在插入過程中沒有表鎖定?

是否可以爲會話動態設置concurrent_inserts? 見http://dev.mysql.com/doc/refman/5.0/en/concurrent-inserts.html

還有什麼其他方法用於非鎖定插入?
「插入延遲」會在插入過程中阻止表鎖定嗎? 請參閱http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html

回答

4

如果您以小批量執行插入操作,使用INSERT DELAYED將讓客戶端從表中選擇基本上優先級,因此它們不會阻止。如果一次插入數千行,您可能會鎖定表格一段時間。另一件可以幫助加速插入的事情是暫時告訴數據庫跳過獨特的檢查。這將阻止對任何唯一鍵的持續分析,但不會阻止表的鎖定。你必須確定你所插入的內容是獨一無二的。

在做很多插入操作時,InnoDB往往是更好的選擇,因爲它會鎖定行而不是表。您的插入需要更長的時間,但您的客戶將看到更好的併發性能。

0

IIRC的MyISAM表鎖,而任何插入偏偏..只要重新讀取並確認:

達到了非常高的速度鎖,MySQL使用表鎖定(頁,而不是 ,行或列鎖定)的所有存儲引擎,除了 的InnoDB,BDB和NDBCLUSTER

來自http://dev.mysql.com/doc/refman/5.0/en/table-locking.html

如果您知道任何非鎖定的MyISAM的插入,請讓我知道 - 因爲這是我每天面對的問題(我不喜歡InnoDB空間消耗和速度)

+0

檢出[併發插入](http://dev.mysql.com/doc/refman/5.0/en/concurrent-inserts.html)。 – 2012-07-23 14:58:20

+0

我不確定這是否適合我的問題 - 基本上我有一個巨大的myisam表和許多獨立運行的插入線程(非常差的應用程序設計,其中插入是單個記錄,而不是分成塊)。每個線程似乎都被阻塞,直到前一個線程執行插入。我會重新閱讀你的鏈接,看看它確實解決了我的問題。感謝您的鏈接。 – FreudianSlip 2012-07-23 15:01:21

+0

併發插入僅防止阻塞SELECT。其他INSERT仍將被阻止(您不能同時向同一文件的末尾寫入兩個單獨的請求)。 – 2012-07-23 16:21:54

1

我有同樣的問題。我試圖將2,500,000條記錄插入到MyISAM表中。這是一張獨立的桌子,所以鎖不會讓我擔心。但是插入過程只是凍結整個數據庫服務器。

所以我做了什麼:

  • 刪除所有的INDEX-ES
  • 做每個刀片有2500行
  • 使用INSERT DELAYED INTO
(在過程的末尾添加這些)

就是這樣。

0

MySQL確實支持在MyISAM表的同一表中插入並行數據。

的MyISAM

MySQL使用對MyISAM,MEMORY表級鎖和MERGE表,只允許一個會話在一個時間來更新這些表,使他們更適合只讀方式,以讀爲主或單用戶應用程序。

但是,上面提到的MyISAM表格的行爲可以被concurrent_insert系統變量改變以實現併發寫入。您可以根據您的要求爲物業設置價值爲12。詳情請參閱鏈接。

因此,事實上,MySQL確實支持InnoDB和MyISAM存儲引擎的併發插入。