2013-03-19 48 views
0

我想通過mysql查詢(無連接)從表中刪除超過200萬條記錄。該表有大約8000萬條記錄。與自動提交Mysql查詢性能= 0

我用set autocommit=0;,它是需要長時間才能完成。如果我使用autocommit=1運行查詢,這會更快嗎?

+0

你做.. [*閱讀*自動提交的文件(http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit),對不對?它確切地說明了它的功能。那麼這個問題僅僅是關於交易的正確使用 - 儘管它們支持特定的引擎。如果使用ACID引擎,那麼由於需要等待硬件*同步*,性能被限制爲每秒大約60 *次寫入事務*(無論如何都是這樣的順序)。對於「自動提交」和手動提交之間的單個語句,*沒有區別。 – 2013-03-19 05:58:56

回答

1

我假設你的表是InnoDB的。對於那200萬行,它需要跟蹤每個修改的撤消日誌條目。這會建立在內存中並最終進入磁盤。這就是爲什麼它需要很長時間。如果你以大塊的方式做,它會阻止它進入磁盤,並讓MySQL跟蹤更少的撤銷日誌條目,從而使事情更有效率。

自動提交發生在您的查詢結束,所以它不會做任何事情。

找出你的塊大小應該是最好的方法是通過實驗。像

delete from table1 limit 1000; 

東西然後繼續加倍,直到你拿出最好的行刪除的每個時間比例。

1

我假設你正試圖運行200萬個人刪除語句。

如果您嘗試使用主鍵批量刪除或範圍在時間刪除100-1000記錄它會更快得多。

例子:

DELETE FROM Table WHERE ID > 0 AND ID < 1000; 

OR

DELETE FROM Table WHERE ID IN (1,2,3,4,5 .... 1000); 

您可以調整的記錄數刪除,以自己的喜好,增加了它相當多,如果你想。在高負載生產服務器上,我通常運行的腳本比這個更小的範圍,可能需要100次,然後再睡一會兒,然後繼續另一個循環。

我總是爲這種類型的東西打開autocommit。管理一個事務以刪除200萬條記錄會增加很多開銷。

另外,請確認您使用的散裝/範圍刪除列是任一主鍵或具有索引。

0

改變自動提交變量的值不會更快。即使自動提交是真實的,MySQL總是會構建舊圖像,因爲如果用戶中斷查詢,那麼它必須具有舊圖像才能回滾。