我有一张相当简单的桌子,大约有一百万行。
id | my_col | other1 | other 2 | ...
此表中有大约15K个不同的“我的列”值,我的列上有一个索引。我有一组7K“我的列”值,需要从该表中删除。
在sql中更有效的方法是什么(我目前正在使用mysql,但将来可能会移植到mssql)。
在我的Java应用程序代码中,它是通过所有的MyoCl值来调用的,并在每一个调用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的值是否会变得低效。
值得一提的是,我的app服务器和数据库服务器都托管在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值创建一个表。