Mongodb id对批量插入性能的影响

时间:2014-06-01 20:17:11

标签: mongodb

我有一个具有guid的类/对象,我希望在保存到Mongodb时将该字段用作_id对象。是否可以使用其他值而不是ObjectId?

当存在_id字段时,在进行批量插入时是否有任何性能考虑因素? _id是一个索引吗?如果我将_id设置为不同的字段,它会减慢批量插入吗?我插入了大约1000万条记录。

2 个答案:

答案 0 :(得分:1)

1)是的,你可以使用该字段作为id。没有提到您用于插入文档的API(如果有)。因此,如果您要在命令行执行插入,则命令为:

db.collection.insert({_id : <BSONString_version_of_your_guid_value>, field1 : value1, ...});

它不一定是BsonString。将其更改为与您的guid原始类型最接近的Bson值(数组类型除外。不允许使用数组作为_id字段的值)。

2)据我所知,db.collection.insert当你提供自己的ID时会有 IS 对性能的影响,尤其是批量生成,但如果id已经排序等,那么不应该是性能损失。原因,我引用:


  

索引的结构是B树。 ObjectIds非常出色   关于索引树的插入顺序:它们总是如此   增加,意味着它们总是插在右边缘   B树。反过来,这意味着MongoDB只需要保持正确   记忆中B树的边缘。

     

相反,_id字段中的随机值表示_ids将是   插在树上。然后机器必须移动一页   索引到内存,更新它的一小部分,然后可能忽略它   直到它再次滑出内存。这效率较低。

                       :from the book `50 Tips and Tricks for MongoDB Developers`

小贴士的标题是 - “当您拥有自己简单,唯一的ID 时覆盖_id。”显然,如果你有一个你不需要ObjectId的属性,那么最好使用你的id。如果您的ID因上述原因而增加,则最好。

3)MongoDB在_id字段上有一个默认索引。

答案 1 :(得分:0)

因此...

  1. 是。 可以使用除ObjectId之外的其他类型,包括GUID将保存为BinData
  2. 是的,有考虑因素。如果您的_id总是在增加(比如越来越多的数字,或ObjectId),那就更好了,否则索引需要更频繁地重建自己。如果您打算使用分片,_id也应该均匀散列。
  3. _id确实自动拥有索引
  4. 这取决于您选择的类型。见第2节。
  5. 结论:最好继续使用ObjectId,除非你有充分理由不这样做。

相关问题