2009-12-07 83 views
3

我試圖從表中刪除行時不斷收到這些錯誤。這裏的特例是我可能同時運行5個進程。刪除行導致鎖定超時

該表本身是一個約450萬行Innodb表。我在我的WHERE子句中使用的列沒有索引。其他指數正在按照預期工作。

它是在一個transcation內完成的,首先我刪除記錄,然後插入替換記錄,並且只有當所有記錄都被插入時,如果事務被提交。

錯誤消息:

Query error: Lock wait timeout exceeded; try restarting transaction while executing DELETE FROM tablename WHERE column=value

它是否有助於創建在這裏引用的列的索引?我應該顯式鎖定行嗎?

我在問題#64653中發現了一些其他信息,但我不認爲它完全覆蓋了我的情況。

確定它是DELETE語句導致錯誤,還是它可能是查詢中的其他語句? DELETE語句是第一個,所以它看起來合乎邏輯,但我不確定。

回答

3

索引肯定會有所幫助。如果你試圖取代已刪除的記錄,我會建議您修改查詢中使用的更新,而不是刪除後的INSERT,如果可能的話:

INSERT INTO tableName SET 
column2 = 'value2' 
WHERE column = value 
ON DUPLICATE KEY UPDATE 
column2 = 'value2' 
+0

更新是不可能的。替換記錄可能會更少/更多。索引有什麼幫助?減少執行時間,反過來降低發生鎖定超時的可能性? – 2009-12-07 13:31:16

+1

啊,我明白了。你考慮到減少執行時間。有450萬行,我猜你正在經歷一些緩慢的查詢。嘗試根據您的某個列標識運行示例select語句,以查看在沒有索引的情況下檢索記錄的速度。然後返回並添加索引並將其用於比較。如果該列是一個相當大的CHAR/VARCHAR,那麼只需使用索引的一部分字段即可減少一些開銷,即** CREATE INDEX partial_idx ON tableName(column(10))**僅使用前10個字符作爲您的索引值。 – 2009-12-07 13:40:47

+0

這個變化很有效。謝謝! – 2009-12-07 14:18:18

1

索引肯定是有幫助。我曾經在一個包含用戶數據的數據庫上工作。網絡前端和用戶刪除有時會出現問題。在白天它工作得很好(雖然花了很長時間)。但在下午晚些時候,它有時超時,因爲數據庫服務器由於日處理結束而承受更多負載。 在受影響的列上敲擊一個索引,並從此處平穩地運行。

+0

是的,就我而言,這是發生此錯誤的並行化。運行單個實例時,它從來都不是問題。 – 2009-12-07 14:18:49