2011-07-20 54 views
1

在MYSQL中,我有表父項,它在表子項(a_child_id和b_child_id)中有兩個外鍵。我試圖刪除使用左連接刪除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

上述查詢,由於大表大小運行24小時,孩子孤兒(這是不相關的表父表子項),我只是想確認該查詢是正確的?

回答

0

難道這不容易嗎?

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

還是你沒有將這些定義爲外鍵?

+0

我沒有在表child中定義的a_child_id或b_child_id,它們在表父項中定義並引用child。 – 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上創建了一個單列索引。