我应该是一个简单的查询:
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
之间存在差异。任何帮助表示赞赏。
答案 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)