標籤:

mysql轉mongodb如何解決ID自增?

現在的項目是PHP+MYSQL的想把mysql換成mongodb的。之前在mysql裡面使用的是ID作為索引並自增的。如何轉換才能儘可能少的減少PHP代碼修改?


Traditional databases often use increasing sequence numbers for primary keys. In MongoDB, the preferred approach is to use Object IDs instead. The concept is that in a very large cluster of machines, it is easier to create an object ID than have global, uniformly increasing sequence numbers.

However, sometimes you may want a sequence number. You can do this by creating "counter" documents and using the findAndModify Command.

function counter(name) {

var ret = db.counters.findAndModify({query:{_id:name}, update:{$inc : {next:1}}, "new":true, upsert:true});

// ret == { "_id" : "users", "next" : 1 }

return ret.next;

}

db.users.insert({_id:counter("users"), name:"Sarah C."}) // _id : 1 db.users.insert({_id:counter("users"), name:"Bob D."}) // _id : 2 //repeat


我還沒遷移到mongodb,之前也想過這個問題,我覺得你可以把mysql留著,建個表只留autoincrement的欄位,專門用來做自增id的服務

另外還可以保留原來的id這個欄位,如果查找的id是一個數字,則用這個欄位查找,否則查找objectid


上網搜能搜到解決方案,但是

1.不優雅

2.性能應該不好

解決方案

1.不要使用自增id

2.使用mysql來做自增id,如果我沒記錯,foursquare的用戶數據也是放在mysql裡面的,因此大規模地混合使用兩種資料庫應該沒有太大問題


How to Make an Auto Incrementing Field

http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field


都選擇mongo了 ,還捨不得丟棄自增。。


寫一個id生成器服務, 挺簡單的


基於資料庫的自增ID其實不難實現,但是這需要你另外建立一個數據集合,我通常是把網站全局參數中的一個欄位作為自增號,比如流水號。

在使用時如果純粹依賴資料庫,那麼就先做一個Inc的Update,使得該數字加1,然後再查詢獲得之。

如果使用緩存方案,可以在網站啟動時將全局參數載入內存,然後每次在內存中的全局參數對象中自加該欄位以獲得最新編號,然後再發送Inc Update。


Create an Auto-Incrementing Sequence Field


實現一個Id生成器,可以用mysql自增,或者redis來做


為什麼非要自增


使用redis來做autoincrement 比mysql效率高。


推薦閱讀:

R markdown 連接mysql數據
一觸即發,2017年,資料庫世界的諸神之戰
mysql注入篇
phxsql如何編譯?
MySQL基礎入門——MySQL與R語言、Python交互

TAG:MySQL | MongoDB |