2013-03-10 103 views
4

MySQL將整天將新值添加到MySQL數據庫中。該表中有超過800萬行。由於有許多舊值,我想在不停止Java程序插入值的情況下清除這些值。MySQL同時對同一個表執行2個查詢

我送此查詢到MySQL:

DELETE FROM `tablename` 
WHERE `from` <= (date_add(now(), interval -20 DAY)) 

,但發生的事情是在Java程序停止添加新值表。有沒有什麼辦法可以在不編輯Java程序的情況下處理這個問題? 我會願意每天運行一次cronjob查詢。

我也嘗試使用參數LOW_PRIORITY,但它沒有任何區別。

+0

是你的表MyISAM或InnoDb不是那麼高效。但是您應該能夠將鎖定級別從表級更改爲行級。 http://dev.mysql.com/doc/refman/5.0/en/innodb-lock-modes.html – charly 2013-03-10 21:02:59

+0

你說java程序停止添加記錄。細節是什麼?它會拋出一個錯誤嗎? – 2013-03-10 21:09:24

+0

你能否澄清一下'oracle'標籤與你的問題有關? – 2013-03-10 21:40:37

回答

2

看來您正在使用舊的MyISAM數據庫引擎。

不幸的是MyISAM使用表級鎖定。當插入,更新或刪除一行時,該表的所有其他更改都會保留,直到該請求完成。在您的情況下,長時間運行DELETE會阻止任何INSERT進入該表。

你可以通過改變你的表引擎InnoDB的這樣的改進:

ALTER TABLE mytable ENGINE = innodb; 

InnoDB引擎是完全事務,並在INSERTUPDATEDELETE沒有鎖定整個表,所以你的問題就會消失。

+0

有關表鎖定的更多信息:http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html Btw MyISAM不是'舊'數據庫引擎,它只是一個用於不同目的的引擎,它仍然保持等。 – charly 2013-03-10 22:43:16

+1

@charly:這取決於你與誰交談。國際海事組織,缺乏MyISAM的交易支持和蹩腳的鎖定,使其陳舊和過時 – mvp 2013-03-10 22:45:03

+0

我不是一個專家,所以我不會真的爲此瘋狂。但是從我讀到的內容來看,MyISAM最終在閱讀密集型表格上表現出色。例如,對於數據挖掘來說這不會很好嗎?或僅僅用於經常閱讀但很少更新的表格? – charly 2013-03-10 22:48:29