2011-08-02 71 views
0

我有一張表格,接近2000萬條記錄並在不斷增長。表被設置爲innodb。有在兩個主要領域的主要指標:optomise非常大的表格查詢

`entries_to_fields` 
entry_id int(11) NO PRI NULL  
field_id int(11) NO PRI NULL  
value text NO  NULL  

儘管記錄數,大部分的查詢,此表是非常快,除了以下:

DELETE FROM `entries_to_fields` WHERE `entry_id` IN (SELECT `id` FROM `entries` WHERE `form_id` = 196) 

這將刪除所有條目數據爲特定的表單。

目前這需要45秒以上,即使條目表沒有返回結果。

我的問題是可以對entries_to_fields結構進行簡單更改,或者我可以進一步驗證我的查詢。

回答

3

當我讀到你的答案後,我寫了這個查詢,可以幫助你(以後)。

DELETE entries_to_fields 
FROM entries_to_fields 
JOIN entries 
ON entries_to_fields.entry_id = entries.id 
WHERE entries.form_id = 196 

... entries.form_id字段應該被索引。

+0

謝謝!我沒有意識到你可以在刪除內部連接。每天學習新的東西! –

1

經過一番嘗試&錯誤+谷歌搜索,我發現在大型表的索引字段上使用IN是一個非常糟糕的做法。

我打破子查詢到一個單獨的查詢,然後創建一個動態查詢,如下所示:

DELETE FROM `entries_to_fields` WHERE `entry_id` = 232 OR `entry_id` = 342 ... 

儘管產生一個潛在的大的查詢,該內〜1秒,現在執行。即使刪除1000條條目。