我正在努力使这里的解决方案(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)需要太长时间才能执行。我能在这里应用优化吗?
谢谢你的协助。
发布于 2018-06-12 11:29:58
慢删除的一个可能解释是,MySQL需要一些时间才能根据子查询中的值查找complete_set表中的每个slice_name。我们可以试着加快速度,如下所示。首先,创建一个新表来替换子查询,它将用作一个物化视图:
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;这里的诀窍是,delete联接应该运行得很快,因为MySQL可以根据物化视图表快速查找complete_set表中的slice_name值,因为后者有一个slice_name索引。
发布于 2018-06-12 14:17:12
如果表的大小太大,那么上面的执行肯定会花费很多时间,因为在删除过程中,每个外部查询行都会运行内部查询。
如果所有单个删除语句分别定义并在批处理或顺序执行时,删除将更快。
https://stackoverflow.com/questions/50815670
复制相似问题