mongodb 导入数据怎么破

2020-07-29 20:55:25 +08:00
 dtgxx

数据量太大 几百亿,但是只有一台机器,存储够用。


数据需要以三个字段建联合唯一索引。


如果不建索引,导入差不多一周就完事了。 但是联合唯一索引在导入数据之后有重复数据就无法创建了,去掉重复数据也非常的难。 建索引之后再导数据,非常非常非常的慢,可能是索引影响了插入速度。。


大佬们有啥高招吗

6499 次点击
所在节点    MongoDB
34 条回复
wupher
2020-07-29 21:01:54 +08:00
那就不要用唯一性索引
dtgxx
2020-07-29 22:23:23 +08:00
@wupher #1 尴尬。。。这个是刚需。。
abcbuzhiming
2020-07-29 22:29:24 +08:00
不能自己写程序读取数据,然后在去重的基础上导入吗?无非就是慢一点呗
dtgxx
2020-07-29 22:33:19 +08:00
@abcbuzhiming #3 写了很多程序,也做了非常多的优化,慢的不行。。数据量太大,程序无法支持去重的。
jiangzhuo
2020-07-29 22:37:47 +08:00
去阿里云 AWS 之类的开一套高性能的机器,导入,然后关闭数据库,把导入好的文件传回你那台机器,用导好的文件启动数据库。
dtgxx
2020-07-29 22:40:05 +08:00
@jiangzhuo #5 你这个建议蛮不错的,以后遇到需求感觉可以这么试试,挺好。只是目前这部分数据价格比较高买的,不太想放到别人服务器。
594duck
2020-07-29 23:08:48 +08:00
就不能先倒入关系数据库,再处理好所有的逻辑。死磕那个干嘛
billlee
2020-07-29 23:23:23 +08:00
你导进去要干嘛?这样即使能导完用起来还是会很慢啊
dtgxx
2020-07-30 00:04:39 +08:00
@billlee #8 查询用,之前不加联合索引是查询是很快的,两百亿数据查询,差不多 50ms 就能返回。
dtgxx
2020-07-30 00:06:13 +08:00
@594duck #7 主要是目前只有一个机器,用关系型数据库会比 mongo 慢更多。mongo 不用联合索引每秒我这可以处理到大约 50 万条数据,关系型数据库单点的肯定做不到。
zxlzy
2020-07-30 01:01:23 +08:00
@dtgxx 他这个建议是最靠谱的了,至于数据价格贵…… 多少大中小互联网公司生死存亡的数据都放在阿里云和 aws 上了。
entertainyou
2020-07-30 03:36:07 +08:00
分表?
594duck
2020-07-30 04:33:49 +08:00
@dtgxx 200 亿 50ms 返回?纯文本文件 200 亿行,grep 一下中间的文件,50ms 都回不了。

要么你这技术已经很到家了,要么我淘汰了
showhand
2020-07-30 06:51:34 +08:00
是不是先读取索引数据,把重复的记下来,然后导入的时候判断下数据是否在重复的索引里面
wupher
2020-07-30 09:16:26 +08:00
索引无非是为了方便查询,你可以在查询函数上做文章,查询多条记录后,再返回你想要的唯一记录,或者通过逻辑字段来标识删除,都是可以的。

唯一性索引本来就很影响性能,数据,建议谨慎使用。几百亿数据,正常都应该 sharding 了,更不建议使用唯一性索引。

5 楼的建议也相当棒,买机器来处理也是条思路。
dtgxx
2020-07-30 09:25:23 +08:00
@zxlzy #11 放阿里云 aws 基本都是民口的。
JCZ2MkKb5S8ZX9pq
2020-07-30 09:26:43 +08:00
需求没看很懂,唯一索引是建一个单独的字段,还是 createIndex ?
如果碰到重复,处理逻辑是什么样的?

另外有个比较基本的差别,insert_many 比逐条插入要快很多。可以考虑先 createIndex 然后批量导入,最后再说处理重复,不知道能不能行。
dtgxx
2020-07-30 09:27:21 +08:00
@wupher #15 确实是,感觉之前的不使用索引的方式也可以,只是下游取的时候得自己做去重了,而且增量订阅的时候,每次更新的数据量也越来越大了。
dtgxx
2020-07-30 09:28:52 +08:00
@JCZ2MkKb5S8ZX9pq #17 三个字段的联合索引,目前使用 mongoinsert 导入数据,insert_one 和 insert_many 都比较慢,都放弃了。重复数据保留任何一条就可以了。
zhuifeng1017
2020-07-30 09:37:54 +08:00
用 mongoimport 导入 csv 或 tsv,重复数据会自动跳过的

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

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

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

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

© 2021 V2EX