2011-08-02 15 views
0

私は20万レコード近くに成長しているテーブルを持っています。テーブルはinnodbとしてセットアップされました。これは、すべて削除されますoptomise非常に大きなテーブルクエリ

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

:このテーブルへのクエリのほとんどは、以下を除いて、非常に迅速です

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

、レコード数にもかかわらず、2つの主要分野での主要な指標があります特定のフォームのエントリデータ。

現在、エントリテーブルが結果を返さない場合でも、これは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を削除する場合でも。

関連する問題