mysql - 如何删除两个大表的析取行?
问题描述
表 products1:30 mio 行表 products2:100 mio 行
两个表不同,但共享一个共同的唯一索引:
create table products1(
...
UNIQUE KEY uniq_products (name, manufacture, releasedate,... <a total of 10 fields> )
)
我想从 table1 中删除所有行,其唯一索引不会出现在 table2 中。
我开始如下:
DELETE FROM products1 p1 WHERE NOT EXISTS (
SELECT 1 FROM products2 p2 WHERE p1.name = p2.name, p1.manufacture = p2.manufacture, ...
)
问题:这是一般的正确方法吗?由于数据集很大,如何加快这样的查询?
解决方案
你delete
似乎做了你想做的事,假设这,
真的意味着AND
. 这是一个合理的查询。
对于此查询:
DELETE p1 FROM products1 p1
WHERE NOT EXISTS (SELECT 1
FROM products2 p2
WHERE p1.name = p2.name AND
p1.manufacture = p2.manufacture AND
);
您需要比较键上的索引: products2(name, manufacture, . . . )
. 如果 10 个键的组合被声明为唯一并且您正在使用所有 10 列进行相等比较,则您已经拥有此索引。
请注意,如果您要删除大量行(数十万或更多),那么开销delete
将对性能产生很大影响。您可能想要创建一个包含所需行的新表(基本上基于上述逻辑)。然后截断原始表并重新插入行。
推荐阅读
- python - python 3 无法识别这个字符
- javascript - 是否可以从代码的 otger 部分访问 innerHTML 'id'?
- python - 如何检查三个数字是偶数还是奇数?
- multithreading - 如何使用 kotlin 从另一个线程更新列表视图
- python-3.x - 在python中使用if else函数缩短代码
- c# - Serilog 文件接收器 - System.MissingMethodException:找不到方法:Serilog.LoggerConfiguration
- excel - COUNTIF 的 Excel 数值精度问题:对于将 X 计数为大于 X 本身的少数数值
- mysql - mysql - 为每组分组的 SQL 结果获取具有最大值的记录
- javascript - 如何以编程方式清除 React 根窗口?
- python - 根据需要添加多个 np.newaxis?