1
vibbow 2014-01-29 20:38:51 +08:00 2
对于问题1:
我能想到的方案是: 对id和name做hash,按照hash排序重新分表,然后去重。 对于问题2,完全没想法。 不过你或许可以看看Twitter的做法。 |
2
nilai 2014-01-29 20:39:19 +08:00
楼主是要整理社工库么?
|
4
a2z OP @vibbow
大概懂你的意思,加一个第三列,md5(concat(id,name)),然后对md5做unique索引。 不过插入到一个表的时候还是会每插入一条就查询一次索引,如果把两个2亿的表合并,还是起码要查2亿次索引…… |
6
vibbow 2014-01-29 20:55:20 +08:00 1
@a2z 你合并那20亿的数据,全部处理一遍是跑不了的了。
还有其实不仅仅可以有第三列,还可以有第四列 其中第三列保存MD5截取前四个字母,转换成integer,第四列再保存完整的MD5 这样可以先快速通过第三列筛选出可能重复的数据,再根据第四列完整对比 可以节约很多查询的。 |
8
vibbow 2014-01-29 20:56:21 +08:00
总之就是个用空间换时间,还是用时间换空间的问题。
|
11
rqrq 2014-01-30 15:33:30 +08:00 2
第一个问题:
一张表2亿数据,加字段就要等半天,还要计算md5,然后再去重的话…… 其实可以先把10张表的数据汇总到一张表new_tbl_all(事先加上id+name的普通联合索引) 然后再建一张不加索引的最终表new_tbl_final 再执行以下sql语句 INSERT INTO new_tbl_final (id, name) SELECT id, name FROM new_tbl_all WHERE id <= 五百万 GROUP BY id, name 自己控制这条sql语句,修改id的值就行(五百万的话,大概要执行400次……) 当然作为一只程序员怎么能容忍手动控制,写个类似分页的脚本让它自己跑吧。 最后再往new_tbl_final表加索引(等吧) 说句题外话,分表不是真正的解决性能问题,维护或者需求有变动就带来各种麻烦。 简单几个字段的话,20亿放到一张表mysql也没问题啊,只要索引正确。 即便性能不行,也可以尝试下表分区,再不行就上pgsql,总会有办法的。 第二个问题: 当然是用lucene、sphinx这种全文引擎,便宜量又足。 |
12
czheo 2014-01-30 15:52:18 +08:00
第一个问题,lz要不考虑下hadoop
|
13
Livid MOD 这种事情完全只应该用 Hadoop 来做。
|
14
a2z OP |
16
lulu00147 2014-05-28 10:37:58 +08:00
。。。。问的这么隐晦 就说你想弄 社工库就得了。。。
|
17
jianzhichun 2016-05-17 19:57:09 +08:00
@a2z 楼主您好,我也遇到同样的问题,数据量更大些,请问能不能分享一下详细代码哇,谢谢[email protected]
|