首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:删除带有子查询和"not in“的行很慢

MySQL:删除带有子查询和"not in“的行很慢
EN

Stack Overflow用户
提问于 2019-05-13 08:30:36
回答 2查看 492关注 0票数 0

我有两张桌子:

产品(id {主键}、dcs_no {索引}和其他)- 1000行

product_price_import (dcs_no {主键}等)- 100 000行

我试着这样做:

代码语言:javascript
复制
DELETE 
FROM product_price_import 
WHERE dcs_no NOT IN (SELECT dcs_no FROM products WHERE dcs_no <> '')

但是,正如预期的那样,我遇到了一个解决方案,如果它是"IN“而不是”IN“,那么这个解决方案就会更快。

代码语言:javascript
复制
DELETE product_price_import 
FROM products 
JOIN product_price_import ON product_price_import.dcs_no = products.dcs_no;

有人能告诉我如何优化查询以从product_price_import表中删除在products表中没有dcs_no值的行吗?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-13 08:48:07

您可以使用LEFT JOIN而不是JOIN,并在products表中检查NULL id值:

代码语言:javascript
复制
DELETE ppi
FROM product_price_import ppi
LEFT JOIN products p ON p.dcs_no = ppi.dcs_no
WHERE p.dcs_no IS NULL
票数 3
EN

Stack Overflow用户

发布于 2019-05-13 12:08:16

我希望这能给我表演

代码语言:javascript
复制
Delete ppi.* from product_price_import ppi where not exists (select * from products p where p.dcs_no = ppi.dcs_no)


For EX
mysql> select * from empty;
+----+
| id |
+----+
|  0 |
|  1 |
|  2 |
+----+
3 rows in set (0.01 sec)

mysql> select * from empty1;
+----+
| id |
+----+
|  2 |
|  3 |
|  4 |
+----+
3 rows in set (0.00 sec)


mysql> delete e1.* from empty1 e1 where not exists (select * from empty e where e.id =e1.id);
Query OK, 2 rows affected (0.13 sec)

mysql> select * from empty1;
+----+
| id |
+----+
|  2 |
+----+
1 row in set (0.00 sec)

同时在两个表中索引dcs_no

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

https://stackoverflow.com/questions/56108456

复制
相关文章

相似问题

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