mysql数据对比_MySQL —— 如何快速对比数据?

本文介绍了如何在MySQL中快速对比两个实例的数据差异。通过使用CONCAT和IFNULL函数组合字段,然后计算MD5值进行对比。当数据量大时,采用分组并计算每组的MD5值,通过比较分组的MD5来定位差异数据,大大提高了对比效率。
摘要由CSDN通过智能技术生成

我们在MySql中想要对比下两个不同的实例上的数据并且找出差异,除了主键之外我们还要对比每一个字段,应该怎么做呢?

方案一:写一个程序将两个实例里面的每一行数据都分别取出来对比,但是耗时我们无法估计,大概天荒地老吧。

方案二:对每一行数据所有字段合并起来,取checksum值,再按照checksum值对比,看着可行,尝试下。

我们可以先用MySql提供的CONCAT函数来合并字段的值,但是如果CONCAT中含有null值,那么就会导致最终的结果为NULL,所以我们要先用IFNULL函数来替换NULL值,比如:

CONCAT(IFNULL(C1,''),IFNULL(C2,''))

由于加入表有很多行,手动拼接脚本比较累,所以我们可以使用information_schema.COLUMNS来处理:

## 获取列名的拼接串

SELECT

GROUP_CONCAT('IFNULL(',COLUMN_NAME,','''')')

FROM information_schema.COLUMNS

WHERE TABLE_NAME='table_name';

假设我们有测试表:

CREATE TABLE t_test01

(

id INT AUTO_INCREMENT PRIMARY KEY,

C1 INT,

C2 INT

)

我们便可以拼接出下面的SQL:

SELECT

id,

MD5(CONCAT(

IFNULL(id,''),

IFNULL(c1,''),

IFNULL(c2,''),

)) AS md5_value

FROM t_test01

我们在这里执行了之后,把结果使用beyond compare对比下,很容易就能找出不相同的行以及主键ID。

但是数据量小一点还行,如果数据量大了,那么执行出来的结果集也是很大的,要想对比就相当费劲,我们就可以尝试缩小结果集,可以将多行记录的MD5值合并起来求MD5值,如果最后MD5的值相同,说明这些行也是相同的,如果不同的话肯定是有差异的,我们再对比这些行就可以了。

假设我们按照1000行一组来进行对比,如果需要将分组后的结果合并,需要使用GROUP_CONCAT函数,注意在GROUP_CONCAT函数中添加排序保证合并数据的顺序, SQL如下:

SELECT min(id) as min_id,

max(id) as max_id,

count(1) as row_count,

MD5(GROUP_CONCAT(

MD5(CONCAT(

IFNULL(id,''),

IFNULL(c1,''),

IFNULL(c2,''),

)) ORDER BY id

))AS md5_value

FROM t_test01

GROUP BY (id div 1000)

执行结果为:

min_id max_id row_count md5_value

0 999 1000 7d49def23611f610849ef559677fec0c

1000 1999 1000 95d61931aa5d3b48f1e38b3550daee08

2000 2999 1000 b02612548fae8a4455418365b3ae611a

3000 3999 1000 fe798602ab9dd1c69b36a0da568b6dbb

当差异数据较少时,即使需要对比上千万数据,我们可以轻松根据根据min_id和max_id来快速定位到哪1000条数据里存在差异,再进行逐行MD5值对比,最终找到差异行。

最终对比图:

a234e72ccd579a9975d135e706be2219.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值