2010-05-27 78 views
8

我必須根據一些標準從具有超過1億行的表中刪除大約10K行。當我執行查詢時,大約需要5分鐘。我運行了一個解釋計劃(delete查詢轉換爲select *,因爲MySQL不支持explain delete),並發現MySQL使用了錯誤的索引。MySQL,刪除和索引提示

我的問題是:有什麼辦法告訴MySQL在刪除過程中使用哪個索引?如果不是,我該怎麼辦?選擇臨時表,然後從臨時表中刪除?

+0

確保您有主鍵,並且刪除的WHERE子句中指定的列已建立索引。 – 2010-05-27 21:03:37

回答

4

index hint syntax//ETA: sadly, not for deletes

ETA: 您是否嘗試過運行ANALYZE TABLE $mytable

如果這還沒有回報,我認爲你有2個選擇:在刪除之前刪除違規索引,然後重新創建它。或者將您的刪除表聯接到所需索引上的另一個表,以確保使用所需的索引。

+1

是的,但據我瞭解,索引提示不適用於刪除語句。 – 2010-05-28 02:17:38

+0

@Manuel Darveau:Drat!只是測試它。你是對的。 – dnagirl 2010-05-28 11:59:09

2

我從來沒有真正遇到MySQL選擇錯誤索引的情況,而是我對索引如何工作的理解通常是錯誤的。

你可能想看看這本書:http://oreilly.com/catalog/9780596003067

它有索引是如何工作的,一個偉大的部分其他調節選項。

+0

+1,這本書讓你看到許多你永遠不會想到的東西。 – newtover 2010-05-27 20:57:56

+0

編輯,dnagirl關於索引提示語法是正確的,我不知道那是上線。 – UltimateBrent 2010-05-27 21:11:42

+0

我見過mysql多次選擇錯誤的索引。對我們來說,它發生在一個有大量類似索引(15個索引)的大型表格(15M行)上。也許是一個瘋狂的場景---有一個原因---並且經常會得到錯誤的索引,即使選擇的inde應該是PRIMARY也是如此。 – 2016-11-02 01:30:46