为任何未来的发现者发布此信息。在做了一些研究之后,我发现这几乎是我可以组合起来的理想解决方案。
第 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 个其他表引用它。