为什么在查询中使用 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
        )