首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL ...基于对另一个表的查询从表中删除记录

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

Stack Overflow用户
提问于 2018-06-12 11:07:32
回答 2查看 935关注 0票数 1

我正在努力使这里的解决方案(SQL Delete Rows Based on Another Table)适应我的需要。例如,

代码语言:javascript
复制
DELETE
FROM complete_set
WHERE slice_name IN (SELECT slice_name FROM changes
                     GROUP BY slice_name HAVING COUNT(slice_name) > 1);

表定义:

  • Table1 ...名称:更改,字段: Id,slice_name,slice_value,行:大约。十万。
  • Table2 ...名称: complete_set,字段: Id,slice_name,slice_value,行:大约。300万。

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

例如,

代码语言:javascript
复制
SELECT slice_name 
FROM changes 
GROUP BY slice_name 
HAVING COUNT(sym) > 1;

(约一秒)

代码语言:javascript
复制
DELETE FROM complete_set 
WHERE slice_name = 'ABC'

(也是一秒钟左右)

上面的解决方案(w/ subquery)需要太长时间才能执行。我能在这里应用优化吗?

谢谢你的协助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-12 11:29:58

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

代码语言:javascript
复制
CREATE TEMPORARY TABLE changes_view
(PRIMARY KEY pkey (slice_name))
SELECT slice_name
FROM changes
GROUP BY slice_name
HAVING COUNT(slice_name) > 1;

现在用一个联接来表达您的删除:

代码语言:javascript
复制
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索引。

票数 1
EN

Stack Overflow用户

发布于 2018-06-12 14:17:12

如果表的大小太大,那么上面的执行肯定会花费很多时间,因为在删除过程中,每个外部查询行都会运行内部查询。

如果所有单个删除语句分别定义并在批处理或顺序执行时,删除将更快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50815670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档