为什么在查询中使用IN(或NOT IN)子句会使它非常慢

时间:2015-02-09 10:11:47

标签: mysql query-optimization query-performance

我有一个问题:

SELECT DISTINCT field1 FROM table1 WHERE field2 = something

(table1包含100万条记录,执行时间:0.106秒,返回:20条记录)

另一个查询

SELECT DISTINCT similarField1 FROM table2 WHERE similarField2 = somethingElse

(table2包含50万条记录,执行时间:0.078秒,返回:20条记录)

现在,如果我运行查询,请将上述两者结合起来:

SELECT DISTINCT field1 FROM table1 WHERE field2 = something AND field1 NOT IN (SELECT DISTINCT similarField1 FROM table2 WHERE similarField2 = somethingElse)

即使运行10分钟也不会给出结果。为什么它变得非常缓慢,这可能是一个潜在的解决方案。

编辑:我正在使用带有dbvisualizer 6.5的MySQL

2 个答案:

答案 0 :(得分:1)

您不需要在子查询中使用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)并且更易于阅读和维护。

答案 1 :(得分:0)

我的查询和建议与@TimSchmelter类似。

事实上,你根本不应该使用distinct。首先你应该删除不同的,并检查你是否得到重复的记录,你只是问你的部分问题。表格设计不明确。

您应该毫不犹豫地发布完整的问题和查询。另外不要忘记在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
        )