合并2个MySQL数据转储的最佳方法是什么?

问题描述

| 我们已经建立了一个MysqL数据库的应用程序。每周我们都会从数据库导出数据转储,并删除所有数据。现在,我们希望将所有这些转储合并在一起,以执行某些数据分析任务。 我们面临的问题是所有表的\“ id \”字段都是Auto-Increment,因此在所有数据转储中均以1开头,这会导致表中的ID重复。我确信必须有更好的方法来完成它,因为这在MysqL管理中应该是很常见的任务。 最好的方法是什么?     

解决方法

如果您可以轻松地识别外键字段(如* _id形式),则可以使用所选的脚本语言通过添加\“ id space offset \”来修改转储文件中的主键和外键。 例如,假设您有两个转储文件,并且知道它们的主键范围不超过1,000,000,则可以将第二个转储文件中的主键和外键增加1,000。 这并不是完全简单的实现,因为您将必须检测语句中外键字段的位置,然后在语句中其他位置的同一列位置处修改值。 如果不能通过通用的命名约定轻松识别外键,则必须在每个表中保留有关如何根据列位置查找其位置的单独信息。 祝好运。     ,最好的方法是拥有另一个充当数据仓库的数据库,将应用程序数据库的内容复制到该数据库中。之后,您无需截断所有表,只需使用DELETE FROM表名-这样,您的auto_increments就不会重置。 导出某些内容,然后截断数据库,然后期望导入将正确进行,这是一个丑陋的解决方案。即使您解决了自动递增冲突的问题(有一个ON DUPLICATE KEY语句,如果唯一键约束失败,该语句也可以使您执行某些操作),也不能保证保留表(外键)之间的关系。 这是一个广泛的话题,给出的解决方案是快速且不好的,其他一些人可能会建议其他方法,但是如果这样做是为了卸载应用程序使用的数据库,那将是一个糟糕的设计。如果您希望通过更大的数据集获得更好的性能,请尝试使用Google MySQL的分区支持。     ,对于您已经转储的数据,将其加载到不使用ID列作为主键的表中。您不必定义任何主键。您将有多个具有相同ID的行,但这不会妨碍您的数据分析。 展望未来,您可以设置一个学科,在该学科中转储,然后删除超过一天的行。这样,您的ID就会不断增加。 或者,您可以将此数据复制到使用ARCHIVE存储引擎的表中。这有利于保留数据以进行分析,因为它会压缩其内容。