0

重构一些旧代码,我们发现类 X 的对象创建得太频繁了,其中约 80% 的对象没有引用。

我有大约 10 个表引用 X 类表中的行。我可以轻松识别孤立行的数量。该表有大约 700 万行,只有大约 150 万行代表合法引用的对象。

修复导致此问题的代码后,我需要以中等性能的方式删除所有这些孤立的行。

以我有限的数据库管理员经验,我知道这样做的唯一方法是选择“X-type”对象的所有合法 ID,然后执行以下操作:DELETE FROM x WHERE id NOT IN (valid_references). 这就像 10 万亿次比较,必须有更好的方法。

4

1 回答 1

0

为任何未来的发现者发布此信息。在做了一些研究之后,我发现这几乎是我可以组合起来的理想解决方案。

第 1 步:创建一个新的临时表,其结构与我们试图缩小大小的表完全相同。

第 2 步:识别引用相关类 (X) 的表/列。

SELECT * 
FROM information_schema.COLUMNS 
WHERE table_schema = 'my_db_name' 
AND column_name LIKE '%reference_column%'

第 3 步:对于这些表/列中具有非空引用的每一行,获取它们引用的 X 行并将其复制到新表中(如果新表中尚不存在)。我逐表进行此操作,并使用一次 1000 条记录的分块方法来节省系统内存。我在我的应用程序层中编写了这个逻辑以更好地控制它。我过去常常INSERT IGNORE避免创建主键冲突,因为某些引用指向同一个 X 对象。

第四步:删除旧表,将新表重命名为与旧表相同的名称。

SET FOREIGN_KEY_CHECKS=0;
DROP TABLE old_table; 
RENAME TABLE new_table TO old_table;
SET FOREIGN_KEY_CHECKS=1;

总而言之,这需要大约一个小时才能在我的环境中运行,其中表 X 有大约 700 万行,我有大约 10 个其他表引用它。

于 2019-01-30T15:49:52.753 回答