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 个表并删除不在第一个表中的位置(大数据集)的主要内容,如果未能解决你的问题,请参考以下文章