2011-07-20 14 views
1

MYSQLには、テーブルの子(a_child_idとb_child_id)に2つの外部キーを持つテーブルの親があります。私はちょうど確認する、上記のクエリが大きいため、テーブルのサイズに24時間稼動している左の結合を使用してMYSQLの孤児を削除する

 
select c.child_id from child c left join parent w on (w.a_child_id=c.child_id or 
w.b_child_id=c.child_id) where w.parent_id is null

子孤児(テーブル親に関連していないテーブルの子のエントリ)を削除しようとしていますクエリが正しいことを確認しますか?

答えて

0

これは簡単ではありませんか?

delete from child 
where a_child_id is null 
and b_child_id is null; 

またはこれらを外部キーとして定義していませんか?

+0

私はテーブルの子に定義されているa_child_idまたはb_child_idを持っていません。それらはテーブルの親と参照の子で定義されています。 – user157195

1

まあ、SELECTクエリは何も削除しないので、その理由は間違っています。

DELETE c FROM child AS c 
LEFT OUTER JOIN parent AS w1 ON c.child_id = w1.a_child_id 
LEFT OUTER JOIN parent AS w2 ON c.child_id = w2.b_child_id 
WHERE w1.a_child_id IS NULL AND w2.b_child_id IS NULL; 

それは二回、親テーブルに参加する奇妙に見えるかもしれませんが、それはおそらく、インデックスよりよい(あなたがa_child_idとb_child_idにインデックスを持っていると仮定)を利用します:

私はこれを試してみました。

EXPLAINを使用して最適化計画を確認する必要があります。 SELECTを削除し、最適化計画を取得変換:それは、「インデックスを使用して」言うとき

mysql> explain select c.child_id from child c 
left outer join parent w1 on c.child_id = w1.a_child_id 
left outer join parent w2 on c.child_id = w2.b_child_id 
where w1.a_child_id is null and w2.b_child_id is null\G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: c 
     type: index 
possible_keys: NULL 
      key: PRIMARY 
     key_len: 8 
      ref: NULL 
     rows: 5 
     Extra: Using index 
*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: w1 
     type: ref 
possible_keys: ac 
      key: ac 
     key_len: 9 
      ref: test.c.child_id 
     rows: 1 
     Extra: Using where; Using index 
*************************** 3. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: w2 
     type: ref 
possible_keys: bc 
      key: bc 
     key_len: 9 
      ref: test.c.child_id 
     rows: 1 
     Extra: Using where; Using index 

それがテーブルを読み取るために必要とせず、のみインデックスを使用して、テーブルへのアクセスを解決することができますことを意味し行。

私は、あなたの説明からあなたのテーブル構造を推測する上記のMySQL 5.5.12をテストしました。私はa_child_idとb_child_idのそれぞれに1列のインデックスを作成しました。