2012-05-15 65 views
1

我將試圖訪問記錄,但會使用這樣的語法排除與記錄,也就是說,ID的列表:MySQL - 不在(......一個巨大的項目...),它會擴展嗎?

WHERE id NOT IN (1,3,4,6,7, ...

由於我的數據庫變大,IDS的該列表也會變得更大。我有一天會遇到問題嗎?

+0

這可能是你需要提高你的數據庫設計一個很好的跡象。必須有更好的方法來標記這些記錄。 –

+3

是的。嘗試像布爾值稱爲「可見」,並使用WHERE'visible' = 0 –

+0

我們聊了多少條記錄? 10^2,10^5,10^100? – RedX

回答

3

考慮存儲ID列表中不同的表排除,然後用下面的SQL:

WHERE id NOT IN (select id from excluded_ids); 

把一個指數的excluded_ids的可伸縮性的id列。

+0

不是那麼簡單。假設像一個社交網絡。您想排除隱私設置設置爲「私人」的個人資料。然後,您還希望排除阻止特定用戶的個人資料(以便用戶無法看到阻止他的那些個人資料)。然後你想排除那些在過去3個月內沒有活躍的配置文件。然後......我認爲不同的表格是可行的。 – StackOverflowNewbie

+0

另外,如果'excluded_ids'有一個gazillion記錄呢?這比提供一個逗號分隔列表更好嗎? – StackOverflowNewbie

+0

@StackOverflowNewbie,如果你使用該表的索引,MySQL不會有排序的逗號分隔的列表。 MySQL對IN()子句中的常量執行二進制搜索,但爲了執行此操作,它首先對值進行排序。 「IN」縮放,但只有二進制搜索的縮放比例。 –

0

我只是跑測試對我自己的數據庫 - 它擁有約800萬行,我排除了其中的十位。花了25秒跑。我認爲,這意味着它沒有可擴展性;)

+1

我會說這不是一個答案,而是一個評論:) – KevinDTimm

2

根據您的語句需要我一般傾向於避免在這種情況下一長串值,它呼喊單獨的表和子查詢。

MySQL manual

值IN列表的數目僅由 max_allowed_pa​​cket的值限制。

因此,請檢查max_allow_packet值以確保一旦此列表變得非常大時,您的語句不會中斷。

相關問題