2016-08-22 6 views
1

私は今、私は別から、これらすべてのkey_idを削除したい私は良い(D1およびD2がインデックス化されている)だと思う10万人以上のレコードを持つテーブルでは約0.1秒で走るこのクエリ、MySQLでこの削除クエリをより効率的にするには?

SELECT key_id 
FROM `info` 
WHERE d1 > 10 AND d1 < 20 AND d2 > 5 AND d2 < 15 
GROUP BY `key_id` 
HAVING COUNT(*) > 300; 

を持っています私はこれを試しました:

DELETE FROM `keys` WHERE id IN (<first query>) 

キーテーブルには約7000行があります。サブクエリは毎回評価されるので、7000回、0.1秒ごと〜= 700秒実行しています。非常に遅い。それはそれを終了させて​​いないので、私はそれが700秒かかるかわからない。私が確かに知っていることは、それが30秒以上かかるということです。

このクエリを改善するにはどうすればよいですか?

答えて

0

私はあなたが追加する必要があると思うサブクエリ

DELETE keys 
FROM keys 
JOIN (<first query>) AS i 
ON k.id = i.key_id 
0

あなたが参加

DELETE FROM `keys` 
INNER JOIN ( 
SELECT key_id 
FROM `info` 
WHERE d1 > 10 AND d1 < 20 AND d2 > 5 AND d2 < 15 
GROUP BY `key_id` 
HAVING COUNT(*) > 300) t on t.key_id = `keys`.id; 
+0

の代わりに登録しよう "'キー\ '\'。* '" "間を使用して試すことができます'DELETE'と' 'FROM'"キーワードを使用します。 (私は完全には必須ではないが、それは私がいつもやっているやり方なのかもしれない。なぜなら、私は常に 'SELECT \' keys \ '。* FROM' 「SELECT」キーワードを「DELETE」に置き換える前に、削除することが多く、結果セットを保存することがあります。ちょっとの場合 – spencer7593

+0

@ spencer7593が必要です。行。http://dev.mysql.com/doc/refman/5.7/en/delete.html – scaisEdge

+0

多テーブルのDELETE構文がOracle、SQL Server、MySQLなどで異なるため、混乱します – spencer7593

関連する問題