繁体   English   中英

“在哪里”条款的实际限制

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM