解析分散式主鍵MongoDB ObjectId,可以作為Mysql主鍵嗎?
哈哈,我自己的文章,被頭條推薦邀請回答,這是什麼操作!那我就再來回答一下吧
MongoDB是分散式的,那麼它是如何保證全局主鍵唯一的呢?首先看下MongoDB ObjectId的數據結構
ObjectId由12個Byte組成,分成4個部分
- 4個byte用於表示當前時間,只到秒(可以考慮下為什麼不是毫秒?)
- 3個byte用於表示當前機器,將網卡信息編碼到3個byte中
- 2個byte用於表示當前進程id
- 2個byte用於自增數
優點
- 不同主機之間,由於網卡信息是不一樣的,因此生成的id是不可能衝突的
- 在同一個主機上,即使部署了多個實例,由於它們的進程ID是不一樣的,因此生成的id也不可能衝突
看到這裡就感覺這樣的方案簡直就是完美,不用任何配置,就自動的生成了全局唯一ID。比起Snowflake演算法好用多了!
那我們不是直接就可以拿到Mysql中用於主鍵欄位了?等等,事情沒那麼簡單!想想mysql數字類型BigInt的最大值,BigInt由8 byte組成,如圖
存不了一個ObjectId的值,這就尷尬了!
但是如果是用Decimal來存ObjectId的值呢?曾經問過我們的DBA,他說從來沒見過,有點怪!大家覺得可行嗎?
推薦閱讀: