Mysql diff 2大型数据库表

Mysql diff 2大型数据库表,mysql,database,algorithm,Mysql,Database,Algorithm,给定两个大表(想象数亿行),每个表都有一个字符串列,如何获得差异?我会考虑在每个数据库中的该列上创建一个索引,然后使用一个程序使用该列上的顺序并行处理每个数据库。当你有相等的记录时,这两种情况都会发生,当你发现它们不同步时,这两种情况都会发生(跟踪顺序不一致的记录)。创建索引在时间和空间上都可能非常昂贵(至少最初是这样)。不过,如果要继续添加记录,则保持更新可能不会增加太多开销。一旦你有了索引,你应该能够处理线性时间的差异。生成索引——假设您有足够的空间——应该是一个O(nlogn)操作。查看开

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

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

查看开源Percona工具包——具体来说,就是实用程序

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

它实际上在后台做的事情有点复杂,它实际上使用了不同的方法,这取决于它能告诉您的表(索引等),但其中一个基本思想是它对索引块进行快速CRC32校验和,如果校验和不匹配,它会更仔细地检查这些记录。注意,这种方法比线性遍历两个索引并比较它们要快得多

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


但是
pt table sync
做了你已经知道的最困难的部分:检测差异,真的很快。它是用Perl编写的;源代码应该提供很好的breadcrumbs。

我忘了提到索引已经计算过了,我应该将列导出到文件中,然后使用一些unix diff实用程序吗?@user-我不会。我可能只需要编写一个程序,在每个DB中的列上执行select/orderby,然后遍历它们,一边计算差异。