我试图根据我的需要调整解决方案(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);
表定义:
单独运行查询的组件非常快......
,例如,
SELECT slice_name
FROM changes
GROUP BY slice_name
HAVING COUNT(sym) > 1;
(袖手旁观一秒钟),
DELETE FROM complete_set
WHERE slice_name = 'ABC'
(也约一秒左右)
上述解决方案(w / subquery)执行时间太长,无法使用。我可以在这里申请优化吗?
感谢您的帮助。
答案 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)
如果表的大小太大,上面的执行肯定会花费很多时间,因为在删除期间内部查询将为每个外部查询行运行。
如果单独定义所有单独的删除语句并批量执行或按顺序执行,则删除速度会快得多。