为什么在查询中使用 IN(或 NOT IN)子句会使它变得非常慢
why using IN (or NOT IN) clause in a query makes it really slow
我有一个问题:
SELECT DISTINCT field1 FROM table1 WHERE field2 = something
(table1包含100万条记录,执行time:0.106sec, returns: 20条记录)
另一个查询
SELECT DISTINCT similarField1 FROM table2 WHERE similarField2 = somethingElse
(table2包含50万条记录,执行time:0.078秒,returns:20条记录)
现在,如果我 运行 一个查询,通过结合以上两者:
SELECT DISTINCT field1 FROM table1 WHERE field2 = something AND field1 NOT IN (SELECT DISTINCT similarField1 FROM table2 WHERE similarField2 = somethingElse)
它甚至 运行宁 10 分钟也没有给出结果。为什么它变得非常慢,什么是潜在的解决方案。
编辑:我正在使用 MySQL 和 dbvisualizer 6.5
您不需要在子查询上使用 DISTINCT
。尝试使用 NOT EXISTS
这可能在 SQL-Server:
中更有效
SELECT DISTINCT field1
FROM table1
WHERE field2 = @something
AND NOT EXISTS
(
SELECT 1 FROM table2
WHERE table2.similarfield1 = table1.field2
AND table2.similarfield2 = @somethingelse
)
编辑:既然你更新了标签,我不确定这在MySql中是否更有效。但是,无论如何,我更喜欢 NOT EXISTS
,因为它也 works with NULL
values(如果您使用 IS NULL
)并且更易于阅读和维护。
我的查询和建议与@TimSchmelter 类似。
事实上,您根本不应该使用 distinct。首先你应该删除 distinct 并检查你是否得到重复的记录你刚刚问你的部分 problem.Table 设计不清楚。
你应该 post 你的完整问题并毫不犹豫地在这里查询。也不要忘记在 feild2、feild1、similarField1、similarField2 上应用索引。
SELECT DISTINCT field1
FROM table1 tbl1
WHERE field2 = something
AND NOT EXISTS (
SELECT similarField1
FROM table2 tbl2
WHERE tbl1.field1 = tbl2.similarField1
AND similarField2 = somethingElse
)
我有一个问题:
SELECT DISTINCT field1 FROM table1 WHERE field2 = something
(table1包含100万条记录,执行time:0.106sec, returns: 20条记录)
另一个查询
SELECT DISTINCT similarField1 FROM table2 WHERE similarField2 = somethingElse
(table2包含50万条记录,执行time:0.078秒,returns:20条记录)
现在,如果我 运行 一个查询,通过结合以上两者:
SELECT DISTINCT field1 FROM table1 WHERE field2 = something AND field1 NOT IN (SELECT DISTINCT similarField1 FROM table2 WHERE similarField2 = somethingElse)
它甚至 运行宁 10 分钟也没有给出结果。为什么它变得非常慢,什么是潜在的解决方案。
编辑:我正在使用 MySQL 和 dbvisualizer 6.5
您不需要在子查询上使用 DISTINCT
。尝试使用 NOT EXISTS
这可能在 SQL-Server:
SELECT DISTINCT field1
FROM table1
WHERE field2 = @something
AND NOT EXISTS
(
SELECT 1 FROM table2
WHERE table2.similarfield1 = table1.field2
AND table2.similarfield2 = @somethingelse
)
编辑:既然你更新了标签,我不确定这在MySql中是否更有效。但是,无论如何,我更喜欢 NOT EXISTS
,因为它也 works with NULL
values(如果您使用 IS NULL
)并且更易于阅读和维护。
我的查询和建议与@TimSchmelter 类似。
事实上,您根本不应该使用 distinct。首先你应该删除 distinct 并检查你是否得到重复的记录你刚刚问你的部分 problem.Table 设计不清楚。
你应该 post 你的完整问题并毫不犹豫地在这里查询。也不要忘记在 feild2、feild1、similarField1、similarField2 上应用索引。
SELECT DISTINCT field1
FROM table1 tbl1
WHERE field2 = something
AND NOT EXISTS (
SELECT similarField1
FROM table2 tbl2
WHERE tbl1.field1 = tbl2.similarField1
AND similarField2 = somethingElse
)