mysql基于对另一个表的查询从表中删除记录

yzuktlbb  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(541)

我正在尝试使这里的解决方案(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/子查询)执行的时间太长,无法使用。我可以在这里应用优化吗?
谢谢你的帮助。

efzxgjgh

efzxgjgh1#

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

q3qa4bjr

q3qa4bjr2#

对于缓慢删除的一个可能解释是mysql需要花费一些时间来查找每个文件 slice_namecomplete_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;

现在使用join短语删除:

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

这里的技巧是delete join应该快速运行,因为mysql可以快速查找 slice_name 价值观 complete_set 表,因为后者在 slice_name .

相关问题