diff 2大型数据库表

时间:2011-04-30 03:41:15

标签: mysql database algorithm

给出2个大表(想象数亿行),每个表都有一个字符串列,你如何获得差异?

2 个答案:

答案 0 :(得分:7)

查看开源Percona Toolkit ---具体来说,pt-table-sync实用程序。

它的主要目的是将MySQL表与其副本同步,但由于它的输出是协调两个表之间差异所需的一组MySQL命令,因此它很适合比较两者。

它实际上做了什么有点复杂,它实际上使用不同的方法取决于它可以告诉你的表(索引等),但其中一个基本的想法是它快速CRC32校验和在索引的块上,如果校验和不匹配,它会更仔细地检查这些记录。请注意,此方法 比线性地遍历两个索引并比较它们更快

但它只能让你成为一部分。由于生成的命令旨在将副本与其主副本同步,因此它们只是为所有不同的记录替换副本的当前内容。换句话说,生成的命令会修改记录中的all个字段(而不仅仅是已更改的字段)。因此,一旦使用pt-table-sync来查找差异,您需要将结果包装成一些东西,通过比较记录中的每个字段来检查不同的记录。

pt-table-sync做了你已经知道的难点:快速检测差异,真的。它是用Perl编写的;来源应提供良好的面包屑。

答案 1 :(得分:0)

我考虑在每个数据库中创建该列的索引,然后使用程序使用该列的顺序并行处理每个数据库。当你有相同的记录时,它会在两者中前进,当你发现它们不同步时,它会在一个或另一个中前进(跟踪不按顺序的记录)。在时间和空间方面(至少在最初阶段),索引的创建可能非常昂贵。但是,保持更新,如果要继续添加记录,可能不会增加太多开销。一旦你有了索引,你应该能够处理线性时间的差异。生成索引 - 假设您有足够的空间 - 应该是O(nlogn)操作。

相关问题