[英]Practical limit on “where in” clause
我有一個相當簡單的表,大約有一百萬行。
id | my_col | other1 | other 2 | ...
此表中有大約 15k 個不同的 my_col 值,並且我在 my_col 上有一個索引。 我有一組需要從該表中刪除的 7k my_col 值。
在 SQL 中做什么更有效(我目前正在使用 MySQL,但將來可能會移植到 MS SQL)。
是不是 a) 在我的 java 應用程序代碼中,遍歷所有 my_col 值並調用 sql 刪除每個值。
for (String my_colValue : listMyCol) {
[delete from my_table where my_col = my_colValue]
}
或 b) 使用“where in”子句構建包含所有這些值的單個 SQL [大] 語句?
delete from my_table where my_col in ('aaa', 'aab', 'aac', ...)
我猜它是 b),但我不確定在這個“where in”子句中指定大約 7k 值是否會變得低效。
就其價值而言,我的應用服務器和數據庫服務器都托管在 Amazon 中,但位於不同的層級。
c) 重新創建您的表。
您將刪除一半的行,所以請考慮一下。 雖然 a) 和 b) 可能會花費很長時間,但重新創建您的表會更棘手但很快。
而且您需要將 7k 值加載到臨時表中,這很容易:
CREATE TABLE newMyTable
AS
SELECT myTable.*
FROM myTable
INNER JOIN myValues
ON myTable.my_col = myValues.my_col
或者如果你不能創建表,也許這會足夠快:
DELETE FROM myTable t
WHERE EXISTS
(
SELECT *
FROM myValues v
WHERE t.my_col = v.my_col
)
但是您需要記住的唯一一件事是:您必須創建一個包含 7k 值的表。
使用WHERE IN
的真正實際限制是您可以使您的 SQL 查詢有多大。 這是由 MySQL 的max_packet_size
配置變量定義的。 其他任何事情都只是性能權衡。 要找出最有效的方法,基准測試仍然是最好的。
我會選擇 go,但我會將所有內容都放在事務中。 這樣,提交將出現在最后,而不是在每個 DELETE 語句之后。
搜索許多記錄時,索引變得低效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.