MySQL快速对比数据技巧

 更新时间:2018年02月05日 08:36:51   作者:笑东风  
这篇文章主要介绍了MySQL快速对比数据的方法以及技巧分享,如果对此有兴趣,一起跟着小编学习下吧。

在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值对比,最终找到差异行。

最终对比图:

PS:

在使用GROUP_CONCAT时,需要配置MySQL变量group_concat_max_len,默认值为1024,超出部分会被阶段。

相关文章

  • Navicat中如何导入数据库SQL脚本并执行

    Navicat中如何导入数据库SQL脚本并执行

    这篇文章主要给大家介绍了关于Navicat中如何导入数据库SQL脚本并执行的相关资料,Navicat是一个强大的MySQL数据库管理和开发工具,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • jdbc中自带MySQL 连接池实践示例

    jdbc中自带MySQL 连接池实践示例

    这篇文章主要为大家介绍了jdbc中自带MySQL连接池实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • InnoDB存储引擎中的表空间详解

    InnoDB存储引擎中的表空间详解

    这篇文章主要介绍了InnoDB存储引擎中的表空间详解,表空间内部,所有页按照区extent为物理单元进行划分和管理,extent由64个物理连续的页组成,表空间可以理解为由一个个物理相邻的extent组成,需要的朋友可以参考下
    2023-09-09
  • Linux下将数据库从MySQL迁移到MariaDB的基础操作教程

    Linux下将数据库从MySQL迁移到MariaDB的基础操作教程

    这篇文章主要介绍了将数据库从MySQL迁移到MariaDB的基础操作教程,当然迁移之前不要忘记数据库的备份!需要的朋友可以参考下
    2015-11-11
  • SQL常见函数整理之Format将日期、时间和数字值格式化

    SQL常见函数整理之Format将日期、时间和数字值格式化

    最近项目总是写sql查询时间,数据库存的时间有各种格式,下面这篇文章主要给大家介绍了关于SQL常见函数整理之Format将日期、时间和数字值格式化的相关资料,需要的朋友可以参考下
    2024-01-01
  • mysql数据库查询基础命令详解

    mysql数据库查询基础命令详解

    这篇文章主要介绍了mysql数据库查询基础命令,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • MySQL 如何查找删除重复行

    MySQL 如何查找删除重复行

    对MySQL 如何查找删除重复行好奇得小伙伴想必也知道MySQL 操作删除重复行,难免有时会需要查看被删除的重行,今天小编就来给大家详解,感兴趣的小伙伴可以参考下面的文章内容
    2021-09-09
  • Mysql存储json格式的实现

    Mysql存储json格式的实现

    本文主要介绍了Mysql存储json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • mysql 基础教程之库与表的详解

    mysql 基础教程之库与表的详解

    这篇文章主要介绍了mysql 基础教程之库与表的详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • Mysql高性能优化技能总结

    Mysql高性能优化技能总结

    这篇文章主要介绍了Mysql高性能优化技能总结的相关资料,需要的朋友可以参考下
    2020-02-02

最新评论