我將試圖訪問記錄,但會使用這樣的語法排除與記錄,也就是說,ID的列表:MySQL - 不在(......一個巨大的項目...),它會擴展嗎?
WHERE id NOT IN (1,3,4,6,7, ...
由於我的數據庫變大,IDS的該列表也會變得更大。我有一天會遇到問題嗎?
我將試圖訪問記錄,但會使用這樣的語法排除與記錄,也就是說,ID的列表:MySQL - 不在(......一個巨大的項目...),它會擴展嗎?
WHERE id NOT IN (1,3,4,6,7, ...
由於我的數據庫變大,IDS的該列表也會變得更大。我有一天會遇到問題嗎?
考慮存儲ID列表中不同的表排除,然後用下面的SQL:
WHERE id NOT IN (select id from excluded_ids);
把一個指數的excluded_ids
的可伸縮性的id
列。
不是那麼簡單。假設像一個社交網絡。您想排除隱私設置設置爲「私人」的個人資料。然後,您還希望排除阻止特定用戶的個人資料(以便用戶無法看到阻止他的那些個人資料)。然後你想排除那些在過去3個月內沒有活躍的配置文件。然後......我認爲不同的表格是可行的。 – StackOverflowNewbie
另外,如果'excluded_ids'有一個gazillion記錄呢?這比提供一個逗號分隔列表更好嗎? – StackOverflowNewbie
@StackOverflowNewbie,如果你使用該表的索引,MySQL不會有排序的逗號分隔的列表。 MySQL對IN()子句中的常量執行二進制搜索,但爲了執行此操作,它首先對值進行排序。 「IN」縮放,但只有二進制搜索的縮放比例。 –
根據您的語句需要我一般傾向於避免在這種情況下一長串值,它呼喊單獨的表和子查詢。
值IN列表的數目僅由 max_allowed_packet的值限制。
因此,請檢查max_allow_packet值以確保一旦此列表變得非常大時,您的語句不會中斷。
這可能是你需要提高你的數據庫設計一個很好的跡象。必須有更好的方法來標記這些記錄。 –
是的。嘗試像布爾值稱爲「可見」,並使用WHERE'visible' = 0 –
我們聊了多少條記錄? 10^2,10^5,10^100? – RedX