主鍵增長策略

2021-10-16 01:30:32 字數 1591 閱讀 6727

1. 資料庫自增長序列或字段

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-qdane5we-1610438478113)(c:\users\yujinling\desktop\筆記\1.png)]

優點:1)簡單,**方便,效能可以接受。

2)數字id天然排序,對分頁或者需要排序的結果很有幫助。

缺點:1)不同資料庫語法和實現不同,資料庫遷移的時候或多資料庫版本支援的時候需要處理。

2)在單個資料庫或讀寫分離或一主多從的情況下,只有乙個主庫可以生成。有單點故障的風險。

3)差找需要關聯上一張表的資訊(比如第一張表結尾是10000,而第二張表的開頭是10001,需要用的第一張表的資料)

2. uuid

優點:1)簡單,**方便。

2)生成id效能非常好,基本不會有效能問題。

缺點:1)沒有排序,無法保證趨勢遞增。

2)uuid往往是使用字串儲存,查詢的效率比較低。

3)儲存空間比較大,如果是海量資料庫,就需要考慮儲存量的問題。

3.redis生成id

當使用資料庫來生成id效能不夠要求的時候,我們可以嘗試使用redis來生成id。這主要依賴於redis是單執行緒的,所以也可以用生成全域性唯一的id。可以用redis的原子操作 incr和incrby來實現。

可以使用redis集群來獲取更高的吞吐量。假如乙個集群中有5臺redis。可以初始化每台redis的值分別是1,2,3,4,5,然後步長都是5。各個redis生成的id為:

a:1,6,11,16,21

b:2,7,12,17,22

c:3,8,13,18,23

d:4,9,14,19,24

e:5,10,15,20,25

這個,隨便負載到哪個機確定好,未來很難做修改。但是3-5臺伺服器基本能夠滿足器上,都可以獲得不同的id。但是步長和初始值一定需要事先需要了。使用redis集群也可以方式單點故障的問題。

另外,比較適合使用redis來生成每天從0開始的流水號。比如訂單號=日期+當日自增長號。可以每天在redis中生成乙個key,使用incr進行累加。

優點:1)不依賴於資料庫,靈活方便,且效能優於資料庫。

2)數字id天然排序,對分頁或者需要排序的結果很有幫助。

缺點:1)如果系統中沒有redis,還需要引入新的元件,增加系統複雜度。

2)需要編碼和配置的工作量比較大。

4. twitter的snowflake演算法

snowflake演算法可以根據自身專案的需要進行一定的修改。比如估算未來的資料中心個數,每個資料中心的機器數以及統一毫秒可以能的併發數來調整在演算法中所需要的bit數。

優點:1)不依賴於資料庫,靈活方便,且效能優於資料庫。

2)id按照時間在單機上是遞增的。

缺點:以能的併發數來調整在演算法中所需要的bit數。

優點:1)不依賴於資料庫,靈活方便,且效能優於資料庫。

2)id按照時間在單機上是遞增的。

缺點:1)在單機上是遞增的,但是由於涉及到分布式環境,每台機器上的時鐘不可能完全同步,也許有時候也會出現不是全域性遞增的情況。

主鍵增長策略

主鍵增長策略 assigned 1.表示手動指定主鍵值 2.不管資料庫中是否支援自動增長語句,該策略都要求程式設定主鍵值 3.該策略是沒有元素時的預設策略 4.容易出現重複的主鍵 identity 1.適用於mysql,ms sqlserver等支援自動增長語句的資料庫,不支援oracle 2.適用...

hibernate的主鍵增長策略

increment 自增,每次增長1,適用於所有資料庫 但是不要使用在多程序 主鍵型別是數值型 select max id from student identity 自增,每次增長1,適用於支援 identity 的資料 mysql,sql server 主鍵型別是數值 sequence nati...

通用mapper主鍵增長策略

資料庫支援自增 常見的如 mysql,sqlserver 建議直接指定資料庫 id keysql dialect identitydialect.mysql private integer id 資料庫不支援自增 常見的如 oracle id keysql sql select seq nextva...