在两个库中查找出差异明细

这个方案是之前一个前同事问我时想出来的,但当时没进行实践,只是觉得可行。

今天终于也遇到这个场景,所以就进行测试。

两个库进行测试,还有其它的方案,比如spark,python,落地文件再对比差异等,各有优劣,比如spark需要集群的支持,并且速度也不是很快。ptyhon对大数据量的支持不是很好,落地文件需要占用存储空间。

这个方案可能简单进行修改为脚本版,然后通过脚本进行计算,即可一次计算3到4位,使迭代次数大大减少,加快执行速度。

另改进的地方是过滤时可使用in,将多个有差异的SQL一次性查找出来。

-- 此例为简明,以每次递进1位进行分析
-- 第一次计算1位
select
     substr(md5_value,1,1) as flag
    ,count(1) as cnt
from (
    select 
        md5(ifnull(id,'123')) as md5_value
    from table_name
) t1
where substr(md5_value,1,0) = ''
group by substr(md5_value,1,1)
order by flag
;

-- 第一次计算2位
select
     substr(md5_value,1,2) as flag
    ,count(1) as cnt
from (
    select 
        md5(ifnull(id,'123')) as md5_value
    from table_name
) t1
where substr(md5_value,1,1) = '3'
group by substr(md5_value,1,2)
order by flag
;

-- 第一次计算3位
select
     substr(md5_value,1,3) as flag
    ,count(1) as cnt
from (
    select 
        md5(ifnull(id,'123')) as md5_value
    from table_name
) t1
where substr(md5_value,1,2) = '33'
group by substr(md5_value,1,3)
order by flag
;

-- 第一次计算4位
select
     substr(md5_value,1,4) as flag
    ,count(1) as cnt
from (
    select 
        md5(ifnull(id,'123')) as md5_value
    from table_name
) t1
where substr(md5_value,1,3) = '333'
group by substr(md5_value,1,4)
order by flag
;

-- 第一次计算5位
select
     substr(md5_value,1,5) as flag
    ,count(1) as cnt
from (
    select 
        md5(ifnull(id,'123')) as md5_value
    from table_name
) t1
where substr(md5_value,1,4) = '3338'
group by substr(md5_value,1,5)
order by flag
;

-- 第一次计算6位
select
     substr(md5_value,1,6) as flag
    ,count(1) as cnt
from (
    select 
        md5(ifnull(id,'123')) as md5_value
    from table_name
) t1
where substr(md5_value,1,5) = '33384'
group by substr(md5_value,1,6)
order by flag
;
+--------+------+
| flag   | cnt  |
+--------+------+
| 333840 |    1 |
| 333841 |    1 |
| 333845 |    1 |
| 333846 |    1 |
| 333847 |    1 |
| 333849 |    1 |
| 33384a |    1 |
| 33384b |    2 |
+--------+------+

+--------+-----+
| flag   | cnt |
+--------+-----+
| 333840 |   1 |
| 333841 |   1 |
| 333845 |   1 |
| 333846 |   1 |
| 333847 |   1 |
| 333849 |   1 |
| 33384a |   1 |
| 33384b |   1 |
+--------+-----+


-- 最后可得到明细记录
select 
     *
from table_name
where substr(md5(ifnull(id,'123')),1,6) = '33384b'
G
原文地址:https://www.cnblogs.com/chenzechao/p/13345707.html