请问如何实现数据对比呢?

2022 年 5 月 31 日
 zx9481

服务器中每天会上传一个 txt 格式的人员清单(应该每天就几万条),为了和数据库中的人员保持一致,需要按行逐一读取与数据库对比,比如数据重复,数据不存在等。。。 个人感觉逐一对比这种方式过于复杂,每读取一行就要遍历一次用户表的数据,请问还有其他效率更高,更简单的方法处理吗?

3098 次点击
所在节点    Java
17 条回复
renmu123
2022 年 5 月 31 日
都拿出来放到内存里来比
zhangshaohan
2022 年 5 月 31 日
数据库中数据不多的话,查关键字段到内存后,与 txt 取差集
lybcyd
2022 年 5 月 31 日
就几万条,量也不大,直接把数据库数据读成一个 k-v 的 map ,再把 txt 的数据读入一个 list ,直接检查 key 是否存在
Joker123456789
2022 年 5 月 31 日
设置一个 唯一约束的字段,插入的时候报错 就说明存在了。
zx9481
2022 年 5 月 31 日
@renmu123
@Geekerstar
@lybcyd
内存处理确实没想到,谢谢大佬!
Joker123456789
2022 年 5 月 31 日
如果你只是想 过滤掉 存在的这条,也可以,用 on duplicate key update 就好了, 插入时发现唯一字段冲突了,就只做更新操作
bxtx999
2022 年 5 月 31 日
bloom filter
F281M6Dh8DXpD1g2
2022 年 5 月 31 日
几万条写到数据库里面一个 join 完事
Macolor21
2022 年 5 月 31 日
1. 先查询所有用户表 /关键数据到内存 1 次网络 I/O
2. 放入 HashMap/ BloomFilter
3. 再读取 txt 的所有数据,构建出 List 1 次文件 IO
4. 遍历 list 比对数据

因为几万条的数据量也不大,假设特别大了,就考虑用 io 来换内存空间了。
lookStupiToForce
2022 年 5 月 31 日
"每读取一行就要遍历一次用户表的数据"
不是,你数据库里那张表的 join_key 不建索引的吗,居然查一次就扫一次全表?
建索引后 b+tree 匹配一条数据就只用查几次而已,树深度通常就 3 撑死了就 4 ,查几次由深度决定
这样几万条记录进去 nested loop join 撑死也就查(几万*4)次而已,再慢再慢的 io 也就几秒钟,哪还用加上其他开发啊?除非你数据库非常繁忙,这几秒钟的 io 都要排队跟其他进程均分。
aec4d
2022 年 5 月 31 日
数据库安装个 xxhash ,数据库和 csv 同时针对主键计算摘要
https://jolynch.github.io/posts/use_fast_data_algorithms/
ChoateYao
2022 年 5 月 31 日
你需要找出不一致的数据,那么循环的少不了,只要你把数据都取出来放内存里面的话,对比还是很快的。
wowh
2022 年 5 月 31 日
不知道是怎么对比?如果有唯一匹配字段的话 ,可以建个索引,直接读取数据库也不慢。

不方便修改数据库的话,也可以把数据库的数据都写到 redis 里,再匹配这样应该更快一些
yazinnnn
2022 年 5 月 31 日
用 hashset 比较的话会很快吧
luozic
2022 年 5 月 31 日
有木有名称重复,没有直接用 Cuckoo Filter
512357301
2022 年 5 月 31 日
题主是 rd 吧,这种问题跟 dba 沟通下吧,这种数据量,这种逻辑对他们来说是小意思,你别乱来,否则得小心他提刀来见,哈哈哈。
其实我觉得#8 楼 @liprais 的方法不错
strawberryBug
2022 年 5 月 31 日
redis sdiff

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/856513

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX