mongodb 唯一索引重复数据问题请教

2020-07-22 11:01:52 +08:00
 dtgxx

大佬们好,我用的 mongodb4.2,目前数据导入进去了,80 亿数据,导了很久。。然后在建联合唯一索引的时候,有数据重复,报错无法创建。。。


有没有什么好的方法可以建联合唯一索引,删了数据先建索引再重新导,实在太折腾太慢了。。。

5079 次点击
所在节点    MongoDB
9 条回复
pupboss
2020-07-22 11:09:57 +08:00
空表先创建索引,再想办法导入,唯一索引重复的就会报错了
tikazyq
2020-07-22 11:11:15 +08:00
试一下把组合字段弄成一个组合键放在_id,直接插入就可以了,主键自动去重
Stypstive
2020-07-22 11:24:17 +08:00
使用 MongoDB 的 Bulk Operation,每 5 万条插入一次很快的。不要用 save 或 insert 方法,太慢了。
holajamc
2020-07-22 11:54:04 +08:00
借楼问一下 80 亿的数据查询效率如何呢?
aborigine
2020-07-22 12:04:07 +08:00
建新表,加索引,旧表导入新表,删旧表
aborigine
2020-07-22 12:05:56 +08:00
联合唯一不如把唯一索引的字段拼接以后取 hash 后单字段索引去重,有效降低索引大小及去重效率
Stypstive
2020-07-22 12:34:54 +08:00
或者找出来重复的数据,删除了,再建索引。

这是一个查找重复手机号的用户的数据的例子,你可以根据你业务改改。

var p = [
{
$group: {
_id: '$mobile',
count: {
$sum: 1
}
}
},
{
$match: {
count: {
$gt: 1
}
}
}
]

db.member_user.aggregate(p)
dtgxx
2020-07-22 15:36:02 +08:00
谢谢大佬们
@pupboss @aborigine 确实应该只能重新导了 mongo2.x 的版本还支持一个参数,目前那个参数废弃了
@tikazyq @aborigine @Stypstive 直接从文件开了 50 个 import 进程导入的,大约 1 秒 40 万条,写代码自定义_id 方式试了一下,插入的性能实在太低了,所以就想建联合唯一索引了。
@holajamc 目前插入 80 亿数据,因为每条数据字段比较少,占空间 700G 多,根据索引查询延迟在 50-80ms 还可以,就用的单台机器,没分片。
tikazyq
2020-07-22 22:44:08 +08:00
@dtgxx 写代码插入肯定没有 native 快,用批量插入可能会快一些

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

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

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

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

© 2021 V2EX