【问题标题】:why using IN (or NOT IN) clause in a query makes it really slow为什么在查询中使用 IN(或 NOT IN)子句会变得很慢
【发布时间】:2015-04-09 01:06:57
【问题描述】:

我有一个问题:

SELECT DISTINCT field1 FROM table1 WHERE field2 = something

(table1包含100万条记录,执行时间:0.106sec,返回: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 分钟也没有结果。为什么它变得非常缓慢,以及可能的解决方案。

编辑:我正在使用 MySQL 和 dbvisualizer 6.5

【问题讨论】:

  • 这是什么,MySql 还是 MS SQL-Server?
  • MySQL,抱歉删除了 sql-server 标签
  • 因为 MySQL 很慢。您可以尝试LEFT JOIN 这两个选择并仅返回那些没有匹配的行。 (leftjoinedquery.field1 为空)。
  • 我同意 GolezTrol。如果可能的话,你应该加入表格。
  • 感谢戈莱兹!我试过SELECT DISTINCT field1 FROM table1 LEFT OUTER JOIN table2 ON table1.field1 = table2.similarField1 WHERE table1.field2 = something AND table2.similarField2 = somethingElse 确实提高了速度(花了 35 秒),但没有给出我想要的结果

标签: mysql query-optimization query-performance


【解决方案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)并且更易于阅读和维护。

【讨论】:

    【解决方案2】:

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

    事实上,你根本不应该使用 distinct。首先,您应该删除 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
            )
    

    【讨论】:

    • 谢谢。餐桌设计很简单,其他的就不用说了……我猜。尝试了您的解决方案但没有帮助,即使在 10 分钟后它仍会继续运行。我想左外连接可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多