MySQL ...基于另一个表的查询从表中删除记录

时间:2018-06-12 11:07:32

标签: mysql optimization subquery

我试图根据我的需要调整解决方案(SQL Delete Rows Based on Another Table)。如,

DELETE
FROM complete_set
WHERE slice_name IN (SELECT slice_name FROM changes
                     GROUP BY slice_name HAVING COUNT(slice_name) > 1);

表定义:

  • 表1 ...名称:更改,字段:Id,slice_name,slice_value,Rows:Approx。 100万。
  • 表2 ...名称:complete_set,字段:Id,slice_name,slice_value,Rows:Approx。 300万。

单独运行查询的组件非常快......

,例如,

SELECT slice_name 
FROM changes 
GROUP BY slice_name 
HAVING COUNT(sym) > 1;

(袖手旁观一秒钟),

DELETE FROM complete_set 
WHERE slice_name = 'ABC'

(也约一秒左右)

上述解决方案(w / subquery)执行时间太长,无法使用。我可以在这里申请优化吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

缓慢删除的一个可能的解释是,MySQL需要一些时间来查找slice_name表中的每个complete_set与子查询中的值。我们可以尝试加快速度,如下所示。首先,创建一个新表来替换子查询,该子查询将用作物化视图:

CREATE TEMPORARY TABLE changes_view
(PRIMARY KEY pkey (slice_name))
SELECT slice_name
FROM changes
GROUP BY slice_name
HAVING COUNT(slice_name) > 1;

现在使用联接来表示您的删除:

DELETE t1
FROM complete_set t1
INNER JOIN changes_view t2
    ON t1.slice_name = t2.slice_name;

这里的(预期)技巧是删除连接应该快速运行,因为MySQL可以快速查找slice_name表中针对物化视图表的complete_set值,因为后者的索引是slice_name

答案 1 :(得分:1)

如果表的大小太大,上面的执行肯定会花费很多时间,因为在删除期间内部查询将为每个外部查询行运行。
如果单独定义所有单独的删除语句并批量执行或按顺序执行,则删除速度会快得多。