需求在一张表中每次写入相关联的数千条数据,这些关联数据使用同一个 id 来标识。 写入之后不会改动,只需要查询或删除。
请问这种情况,是应该使用类似 sql 表的形式,写入同一 id 的数千条数据 [id:abc,field1:xxx,...,filedn:xxx] [id:abc,field1:xxx,...,filedn:xxx] . . . [id:abc,field1:xxx,...,filedn:xxx]
还是使用 mongo 的内嵌数组在比较好呢 id:abc, data:[ {field1:xxx,...,filedn:xxx}, . . . {field1:xxx,...,filedn:xxx}, ]
主要是需要考虑查询效率,如果按第一种设计数据量可能是亿级别的,用 id 查询依然十分费劲 对 mongo 不太了解。1.不知道内嵌数组的性能可靠不 2.不知道用 id 建立索引后,用 id 查询是否依然会去扫内嵌的数千条数据,如果依然扫似乎不会比第一种效率高 跪求大神指点迷津
1
syzh 2020-11-14 08:05:51 +08:00 via iPhone
第二种方式比较好吧,第一种方式的话,不如用 mysql 分库分表的方案了。以及第二种方式用 id 查询,为什么会扫内嵌的数据..
|
2
xuanbg 2020-11-14 08:31:51 +08:00
查询居多用内嵌
|
3
teawithlife 2020-11-14 08:35:59 +08:00
肯定选第二种,这是 mongoDB 的优势,也是推荐用法,效率会有极大的提升
|
4
myCupOfTea 2020-11-14 11:02:37 +08:00
@syzh 盲猜,也有其他查询条件
|
5
TJT 2020-11-14 11:21:01 +08:00
取决于内嵌数组中的数据会不会有跨文档的查询需求, 如果有且需求不固定, 那还是第一种比较好, 另外单个文档最大 16MB.
MongoDB 嵌套文档的性能很好, 只要你的设计合理. |
6
BoarBoar OP |
8
tangtj 2020-11-14 12:54:28 +08:00
内嵌数组中的数据会不会变大很大。我们遇到了一个问题,一个字段是嵌套数组,数组内容是一直在增加的。时间长了之后,有些数组开始有十几万个元素,部分查询没有排除掉这个字段,即使没有使用上这个字段但是依然被查询了出来,内网带宽使用巨大,没能把所有查询都找出来强制排除掉这个字段。最后把数据全部迁出来了,重构了需要使用这个字段的代码,把内嵌数组字段直接清空了。内网带宽用量从接近 Gb/s 下降到了 十几 Mb/s . 当然这是使用和设计上的问题,不得不说,Mongodb 是真的强。
|