我正在尝试使这里的解决方案(sql根据另一个表删除行)适应我的需要。例如。,
DELETE
FROM complete_set
WHERE slice_name IN (SELECT slice_name FROM changes
GROUP BY slice_name HAVING COUNT(slice_name) > 1);
表定义:
表1。。。名称:更改,字段:id,切片名称,切片值,行数:约10万。
表2。。。名称:完整集,字段:id,切片名称,切片值,行数:约300万。
单独运行查询的组件非常快。。。
例如。,
SELECT slice_name
FROM changes
GROUP BY slice_name
HAVING COUNT(sym) > 1;
(即兴约一秒钟),和
DELETE FROM complete_set
WHERE slice_name = 'ABC'
(大约一秒钟)
上面的解决方案(w/子查询)执行的时间太长,无法使用。我可以在这里应用优化吗?
谢谢你的帮助。
2条答案
按热度按时间efzxgjgh1#
如果表的大小太大,上面的执行肯定会花费很多时间,因为在删除过程中,内部查询将针对每个外部查询行运行。
如果将所有单个的deletion语句单独定义并成批或按顺序执行,则删除速度会更快。
q3qa4bjr2#
对于缓慢删除的一个可能解释是mysql需要花费一些时间来查找每个文件
slice_name
在complete_set
表中的值。我们可以试着加快速度如下。首先,创建一个新表来替换子查询,子查询将作为物化视图:现在使用join短语删除:
这里的技巧是delete join应该快速运行,因为mysql可以快速查找
slice_name
价值观complete_set
表,因为后者在slice_name
.