MySQL`EXPLAIN'表示DEPENDENT QUERY,即使没有相关性

时间:2018-05-17 09:05:48

标签: mysql sql

我应该是一个简单的查询:

DELETE FROM schema_a.table_a 
WHERE column_a = 'VALUE_A' AND column_b NOT IN (SELECT id FROM schema_b.table_b)

但是这个查询非常慢。运行EXPLAIN显示子查询的类型为“DEPENDENT SUBQUERY”,这意味着它将运行与外部查询中的行一样多的次数。但为什么会这样呢?我没有看到内部查询和外部查询之间存在任何关系。

有趣的是,即使我用DELETE FROM替换SELECT * FROM,内部查询的类型为“SUBQUERY” - >即这将非常快。

我想知道为什么EXPLAIN之间存在差异。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

尝试使用 NOT EXISTS

DELETE FROM schema_a.table_a tbl_a
WHERE tbl_a.column_a = 'VALUE_A' 
AND NOT EXISTS (SELECT 1 
                FROM schema_b.table_b tbl_b 
                WHERE tbl_b.id = tbl_a.id)

答案 1 :(得分:0)

我找到了这种情况发生的原因。我需要为两个表设置一个别名。如果我这样做,那么查询会变得更快,并且不再是依赖的子信息。

DELETE tbl_a FROM schema_a.table_a tbl_a
WHERE tbl_a.column_a = 'VALUE_A'
AND tbl_a.column_b NOT IN (SELECT tbl_b.id FROM schema_b.table_b tbl_b)