在我的 mariaDB 数据库中处理大型数据集。我有两个表,其中表 A 包含 5700 万行,表 B 包含大约 500 行。表 B 是与表 A 中的列相关的 ids 的子集。我想删除 A 中没有相应 ID 的所有行表B.
示例表 A:
classification_id | 姓名 |
---|---|
20 | 梅赛德斯 |
30 | 川崎 |
80 | 徕兹 |
70 | 惠普 |
示例表B:
classification_id | 类型 |
---|---|
20 | 汽车 |
30 | 自行车 |
40 | 公交车 |
50 | 船 |
因此,在此示例中,表 A 中的最后两行将被删除(或者将创建一个仅包含前两行的镜像表,这也可以)。
我尝试使用内部联接执行第二个查询,但此查询花了几分钟才给出内存不足异常。
关于如何解决这个问题有什么建议吗?
由于您说过滤表包含相对较少的行数,因此最好的选择是创建一个单独的表,其中包含与原始表
A
相同的列以及与您的匹配的行criteria,然后替换原始表并删除它。另外,对于如此数量的 ID,您可能希望使用WHERE IN ()
而不是联接 - 只要您在那里使用的字段已建立索引,它通常会方式 em> 更快。将所有内容放在一起:需要注意的事项:
A
有任何索引或外键,这些将不会被复制 - 因此您必须手动重新创建它们。我建议首先运行SHOW CREATE TABLE A
并记下其结构。或者,您可以考虑使用SHOW CREATE TABLE A
的输出作为模板显式创建表new_A
,然后执行INSERT INTO new_A SELECT ... code> 而不是
CREATE TABLE new_A AS SELECT ...
并在此之后使用相同的查询。试试这个: