2010-10-14 88 views
1

我有一個查詢,看起來像這裏/在這裏有用嗎?

SELECT to_number FROM sent_texts 
WHERE to_number NOT IN(SELECT mobile FROM action_6_members); 

A,其中應用到結果集 後完成查詢。
什麼會影響被(提高/降級)如果子查詢中包含

WHERE mobile = to_number 

具有被施加到結果期間查詢設定
什麼會的效果(提高/降級)如果子查詢中包含

HAVING mobile = to_number 

什麼都只是使用原始查詢的優點/缺點?


更新
看來我最初的想法是錯誤的,這要歸功於Bill Karwin's answer

所以我會更新這與原始查詢的解釋。

此查詢導致我的服務器使用100%的cpu。

也許有人可以說爲什麼,以及如何解決它?

 
id select_type   table    type possible_keys key  key_len ref rows Extra      
2 DEPENDENT SUBQUERY action_6_members index     mobile  42   179218 Using where; Using index 
1 PRIMARY    sent_txts   index     to_number 123   256066 Using where; Using index 

這是基於講解關閉連接(在一些更優化)

 
id select_type table    type possible_keys key  key_len ref rows Extra         
1 SIMPLE  sent_txts   index     to_number 78   256066 Using index       
1 SIMPLE  action_6_members index     mobile  27   179218 Using where; Using index; Not exists 
+0

對它們運行'explain plan'並比較結果。 – 2010-10-14 00:17:57

回答

5

只要使用原來的查詢。 MySQL optimizes這種情況一切正常,特別是如果mobile是索引列。它運行一次不相關的子查詢,並且將to_numbermobile號碼的集合進行合理有效比較。

我不知道你在哪裏得到了關於在查詢後應用WHERE條件以及在查詢期間應用條件的HAVING的想法。這是不準確的。

認爲它是這樣的:

  • WHERE條件消除從結果集。這是在查詢過程中完成的。

  • HAVING條件消除從結果集。這也是在查詢過程中完成的,但GROUP BY已將行收集到組中。如果您不使用GROUP BY,則不應使用HAVING

0

也許這樣。 SELECT to_number FROM sent_texts WHERE NOT EXISTS(SELECT mobile FROM action_6_members where mobile = to_number);

我不確定它是否有幫助。嘗試比較執行計劃。

0

我想你要找的內容與你的WHERE mobile = to_number是一個相關子查詢:

​​

一般而言相關子查詢都是不可取的。但在這種情況下,MySQL應該將相關子查詢和原始子查詢優化到相同種類的DEPENDENT SUBQUERY。您可以使用EXPLAIN SELECT ...查看您的數據和索引。

在任何情況下,如果可以的話,您通常最好使用連接而不是MySQL中的子查詢。這個空連接:比對我也子查詢方法快

SELECT to_number 
FROM sent_texts 
LEFT JOIN action_6_members ON action_6_members.mobile=to_number 
WHERE action_6_members.mobile IS NULL 

執行的33%(可能不同的數據;對於小數據的差異可能無法衡量)。

+0

我剛剛也試過這個,結果相同,服務器使用100%cpu – Hailwood 2010-10-14 00:39:40

+0

更新中的'EXPLAIN'輸出有點奇怪。它聲稱是'使用索引',但在子查詢中掃描的行數不然,'possible_keys'和'refs'列只是丟失。你有'to_number'和'mobile'列的索引嗎?無論您使用連接還是子查詢,您都需要索引來使這種查詢容忍。 – bobince 2010-10-14 01:00:43

+0

是的,我在這兩個上都有一個btree索引。 我只是去做了一些更多的優化,所以我會發佈一個解釋你的查詢 – Hailwood 2010-10-14 01:11:30