2012-07-02 127 views
0

我在NOT IN語句中有超過400 000個id。它會執行還是不執行?MySQL查詢長度

$query = " 
    SELECT 
     * 
    FROM 
     table_name 
    WHERE 
     my_field_id NOT IN(
      34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454, 
      34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454, 
      34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454, 
      34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454, 
      34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454, 
      34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454 
     ) 
"; 
+0

這些ID從哪裏來? – xdazz

+0

@miqdad阿里你能告訴我這個查詢的執行時間,似乎在我看來:) – Rinzler

+0

@Rinzler:這個查詢很可能產生表全面掃描。所以執行時間取決於表的大小 – zerkms

回答

1

是的,它會(你可以自己嘗試,而不必在這裏實際詢問)。 sql查詢字符串沒有合理的限制。

但是你應該記住多個ID添加 - 慢查詢將

PS:只有mysql的設置,您可能感興趣的是max_allowed_packet。從我記得它是唯一的參數,可能會帶來一些特大的查詢

+0

謝謝....我沒有試過這個,因爲,我害怕這個查詢會讓我的服務器停機...這就是爲什麼我首先確認:) –

+1

@Miqdad Ali:你沒有開​​發服務器嗎?! – zerkms

0

因爲我知道在MySQL中的IN子句沒有限制,你可以寫你想要的多個id。同意zerkms的性能和max_allowed_packet變量。

作爲一種解決方法 - 嘗試用索引id填充另一個表(可能是臨時表),然後使用JOIN子句將這兩個表加入。

0

AFAIK對於NOT IN,限制爲1024個字符。如果您使用子選擇,則沒有限制。您可以使用ID填充內存表,在查詢中使用子選擇來獲取它們,然後刪除內存表。這甚至可能會更快。