MariaDB 比较 2 个表并删除不在第一个表中的位置(大数据集)

Posted

技术标签:

【中文标题】MariaDB 比较 2 个表并删除不在第一个表中的位置(大数据集)【英文标题】:MariaDB Compare 2 tables and delete where not in 1st (Large Dataset) 【发布时间】:2021-07-24 03:24:27 【问题描述】:

作为 uni 项目的一部分,我正在使用 MariaDB 通过算法清理一些大型 CSV,并且由于其大小,我正在使用 MariaDB 10.5.9。

数据为 5 列,包含日期、时间、PlaceID、ID(不唯一且重复)、位置 它是一个大型数据集,每天大约有 50+ 百万条记录,在 1 周内总共有 3.86 亿条记录。

我开始每天单独运行算法,效果很好,整个过程需要 11 到 15 分钟。

当尝试运行 7 天的总和时,我会对性能产生一些重大影响。 大多数元素都有效,但我有 1 个查询将 ID 中的值与已知良好 id 的列表进行比较,并删除任何不属于已知良好的。

DELETE quick FROM merged WHERE ID NOT IN (SELECT ID FROM knownID) ;

在每日表上,此查询大约需要 2 分钟(比较 5000 万和 1.25 亿已知良好,两个表都有索引以加快每个表的 ID 列的处理速度。

合并数据的表大小为 24.5GB,已知数据为 4.7GB

在整个一周内运行时,我预计查询时间大约是 7 倍(加上一点),查询时间不到 2 小时?我怎样才能提高这种性能?我在执行工作时将两个表加载到内存表中,然后在完成后复制回基于磁盘的表以尝试加快进程,服务器有 256GB 内存,所以那里有足够的空间。我可以更改/调整任何其他设置吗?

my.ini 如下:

innodb_buffer_pool_size=18G
max_heap_table_size=192G
key_buffer_size=18G
tmp_memory_table_size=64G

非常感谢

【问题讨论】:

【参考方案1】:
innodb_buffer_pool_size=18G -- too low; raise to 200G
max_heap_table_size=192G    -- dangerously high; set to 2G
key_buffer_size=18G         -- used only by MyISQM; set to 50M
tmp_memory_table_size=64G   -- dangerously high; set to 2G

这会删除多少行?

DELETE quick FROM merged
     WHERE ID NOT IN (SELECT ID FROM knownID) ;

更改为DELETE 的“多表”语法并使用LEFT JOIN ... IS NULL

如果您要删除的行数超过一千行,请分块进行。见http://mysql.rjweb.org/doc.php/deletebig

正如该链接中所讨论的,可能只使用您想要保留的行来构建一个新表。

DELETE 必须保留旧行直到语句结束;然后(在后台)进行实际删除。这是很多开销。

如需进一步讨论,请为两张表提供SHOW CREATE TABLE

【讨论】:

以上是关于MariaDB 比较 2 个表并删除不在第一个表中的位置(大数据集)的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询加入,比较两个表并返回第一个表中的所有记录

MySQL JOIN 2 个表并分别获取两个表的总和

比较 2 个表并返回 MySQL 中的变化

Access - 比较两个表并在第一个表中更新或插入数据

如何从一个表中选择不在其他表中的所有行?

用SQL语句创建四个表并完成相关题目