mongoDB修改"_id"的objectID到普通递增id为什么不好

以前学过sql,现在在学mongodb。看到objectID各种想把它改成和sql一样从1开始auto increment的id,我就全给update了。听说并不能这样做,还是要保留mongo原有的自动生成的obectID, 但是为什么?

阅读 15k
2 个回答

从原理上面分析一下其实很容易得到答案。假设你手里有一叠号码,1到100,下面:

  1. 来了一个人问你要一个号,你给他一张,这没问题。

  2. 两个人一起到了,都问你要一个号,你怎么办?慢点一个个来啊,发完一张再发一张,慢点但也将就

  3. 同时来了10个人问你要号怎么办,100个人呢?

把来了多少人想象成并发请求,不难发现很快分配号码这点成了瓶颈。所以自增ID其实对RDBMS也并不是什么好事呢。但好在传统数据库是单机的,无非就是自己给自己加个锁在内存中处理竞争,问题不大。MongoDB是个分布式数据库,几台机器要互相协调你拿1,我拿2,他拿3,这个锁要通过网络协调,就很低效了。
想想分布式的目的,其中之一就是提高并发,所以自增ID和高并发其实是背道而驰的,在分布式环境中要保证正确递增势必要影响效率。再说自增ID除了看起来清爽点实际上也没有什么太大的优势,所以必然就被放弃了。(记住ObjectID实际上也是可以排序的,就是插入时间顺序)

https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/#considerations

Generally in MongoDB, you would not use an auto-increment pattern for the _id field, or any field, because it does not scale for databases with large numbers of documents. Typically the default value ObjectId is more ideal for the _id.

文档上自己说,not scale for databases with large numbers of documents,自增的不适合有大数量documents的数据库

推荐问题
宣传栏