MongoDB 为什么本站不用 ObjectId

twm · 2013年12月01日 · 最后由 huacnlee 回复于 2014年07月30日 · 8883 次阅读

shoudong 设置自增 id 有好处或者害处吗?

objectid 难看。

#1 楼 @Rei 我估计 IT 圈之外没几个人在乎 URL 看起来如何吧? 还有 Safari/Firefox 都把 schema 和 path 显示成浅灰色了,只留 doamin 部分. 另外 objectid 可以更好地应对高并发.(写的时候)

#2 楼 @gihnius 分片、备份时不用 objectid 会有问题吗?

#1 楼 @Rei 难看应该是技术人员思维 😄,之前见到过一个说法就是顺序自增别人采集会比较方便。

#4 楼 @twm 我觉得“难看”,“高并发”,“分片”,“采集”这几个理由里面,我提的理由最不技术人员思维了。

自增 id 和 objectId 各有优劣处。

自增 id 缺点: 容易被人识别从而用机器来爬,当然这点对于论坛之类的反而是好处. 容易被竞争对手做出统计数据

优点: 站内统计很方便,id 短小,节约各种资源,可以用 id 代替 createTime 来排序 等等

objectId 缺点: 太长了,太难记了,耗费数据库空间和 log 空间

优点: 安全性高,可以分布式计算,无计算 IO

高并发在很长一段时间内其实根本不是问题,发帖本来就是少数行为,即便是 mongodb 的 findAndModify + $inc 的组合,速度也足以支持至少几千个 id 的生成。 (我测了下,在我机器大概 1 秒最快能生成 6k 个)

除非需要微博那种发帖量 引致网上

目前我知道新浪微博最高峰 3 万 2 每秒,Twitter 最高峰 2 万 5 每秒。 欧洲杯决赛时,Twitter 峰值 1 万 5 每秒 世界杯刘翔摔倒后,新浪微博峰值 1 万 9 每秒

http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

Warning 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.

用自增数字 ID 有两点原因:

  • 简单好记,便于使用(比如偶尔会用一个 id 在服务器 Rails Console 里面查出来处理一下什么的);
  • 可以用来作为时间排序,省去在 created_at 字段上面增加额外的索引。

@huacnlee 用 Objectid 写入数据的时候,默认以 objectid 为索引,并且按照 Objectid 的时间戳升序排列了

#10 楼 @ky492591149 多服务器的时候,ObjectId 排序是有问题的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号