现有一个A表和B表,他们具有同样的表结构(ID, CODE, DATATIME,...),其中有一些数据具有相同的ID,现在需要统计:
- A表相对比B表有多少不同ID的数据
- B表相对比A表有多少不同ID的数据
- A表中有多少和B表ID相同但其他列不同的数据
- A表中有多少和B表ID相同并且其他列也相同的数据
需要注意的是,A表和B表的数据量均在500万左右,需要比较的列在10列左右,B表数据基本不会更新,但A表数据时刻可能更新。希望得到一个尽可能高效并且耗费内存较少的解决方案。
我的解决方案:
- 同时将A表和B表数据缓存到内存,拿着A表的每条数据逐条去B表中对比,同时统计结果。这样比较耗费内存,单条请求就可能耗费近几GB内存,放弃;
- 直接通过SQL查询出统计结果,例如SELECT COUNT(*) FROM A WHERE NOT EXSIT (SELECT 1 FROM B WHER A.ID = B.ID)得到问题1的结果。
环境:
MySQL5.7
目前采用在A表打标记的方法,在A表新增了一个CHANGE_STATE列(bit(2)); 00-情况1,01-情况3;10-情况4;在B表新增一个CHANGE_STATE字段(B表中CHANGE_STATE为00的就表示情况2).开始时先手动处理一下库里的数据,之后对于A表任何一条记录的更新都同时更新他的CHANGE_STATE,如果是删除就需要去更新B表的CHANGE_STATE。查询时直接在A表中查(需要对A表的CHANGE_STATE列上创建索引),效率还不错,平均查询时间稳定在2S内