前言:
系統唯一 ID 是我們在設計一個系統的時候常常會遇見的問題,以下介紹一些常見的 ID 產生策略。
● Sequence ID
● UUID
● GUID
● COMB
● Snowflake
最開始的自增ID 為了實現分庫分別的需求,會在自增的前提下,使用不同起點,但需要做資料庫拓展時,極為麻煩。例如剛開始時,我們設計某個系統的資料庫時,這個資料庫中會有10 個表,那麼我們對於每個表的內容都需要不同的ID 我們就可以使用不同不長自增的形式,例如,第一張表的是1、11、21、31。 。 。第二張表是 2、12、22、32。 。 。第三張表是 3、13、23、33。 。 。第十張表就是 10、20、30。 。 。但這樣的問題就是,如果有一天我發現這個系統的 10 張表已經不夠用了,我想要再增加一張表,那麼這時的主鍵該怎麼分配呢?另外,如果對於多個資料庫的資料希望合併,但是對於這種簡單的生成 ID 方式,重複的可能性很大,所以幾乎一定會發生重複這種情況。 顯然,如果使用先前的方法的可擴展性會比較差。
比較自增ID,UUID 產生唯一主鍵更方便(資料量非常大的情況下,存在重複的可能),但由於UUID 的無序性,效能不如自增ID,字串儲存,儲存空間大,查詢效率低。關鍵:使用 uuid 的缺點是查詢效率低啊!
COMB 相對於 UUID,增加了產生 ID 的順序性,插入與查詢效率都有提升。這篇文章有簡單的分析。
Sonwflake 是 Twitter 主鍵產生策略,可以看做是 COMB 的改進,用 64 位元的長整型取代 128 位元的字串。 ID 構成:第一位 0 41 位元的時間前綴 10 位元的節點標識 12 位元的 sequence 避免併發的數字。
第一部分:Sequence ID
資料庫自增長序列或字段,最常見的方式。由資料庫維護,資料庫唯一。
優點:
簡單,程式碼方便,效能可以接受。
數字 ID 天然排序,對分頁或需要排序的結果很有幫助。
缺點:
不同資料庫語法和實作不同,資料庫遷移的時候或多資料庫版本支援的時候需要處理。
在單一資料庫或讀寫分離或一主多從的情況下,只有一個主庫可以產生。有單點故障的風險。
在效能達不到要求的情況下,比較難於擴充。
如果遇見多個系統需要合併或涉及到資料遷移會相當痛苦。
分錶分庫的時候會有麻煩。
優化方案:
針對主函式庫單點,如果有多個Master 函式庫,則每個Master 函式庫設定的起始數字不一樣,步長一樣,可以是Master 的個數。
例如:Master1 產生的是 1,4,7,10,Master2 產生的是 2,5,8,11 Master3 產生的是 3,6,9,12。這樣就可以有效產生叢集中的唯一 ID,也可以大幅降低 ID 產生資料庫操作的負載。
第二部分:UUID
npm 管理 https://www.npmjs.com/package/uuid
#常見的方式,128 位。可以利用資料庫也可以利用程式生成,一般來說全球唯一。
UUID 是 128 位元的全域唯一標識符,通常由 32 個位元組的字串表示。它可以保證時間和空間的唯一性,也稱為 GUID,全稱為:UUID ―― Universally Unique IDentifier,Python 中叫做 UUID。
它透過 MAC 位址、時間戳記、命名空間、隨機數、偽隨機數來保證產生 ID 的唯一性。
UUID 主要有五個演算法,也就是五種方法來實作。
(1)、uuid1()
――基於時間戳記。由 MAC 位址、當前時間戳記、隨機數產生。可以確保全球範圍內的唯一性,但 MAC 的使用同時帶來安全性問題,在區域網路中可以使用 IP 來取代 MAC。
(2)、uuid2()
基於分散式計算環境 DCE(Python 中沒有這個函數)。演算法與 uuid1 相同,不同的是把時間戳記的前 4 個位置換成 POSIX 的 UID。實際中很少用到該方法。
(3)、uuid3()
基於名字的 MD5 雜湊值。透過計算名字和命名空間的 MD5 雜湊值得到,保證了同一命名空間中不同名字的唯一性,和不同命名空間的唯一性,但同一命名空間的同一名字產生相同的 uuid。
(4)、uuid4()
基於隨機數。由偽隨機數得到,有一定的重複機率,該機率可以計算出來。
(5)、uuid5()
基於名字的 SHA-1 雜湊值。演算法與 uuid3 相同,不同的是使用 Secure Hash Algorithm 1 演算法。
優點:
簡單,程式碼方便。
全球唯一,在遇見資料遷移,系統資料合併,或資料庫變更等情況下,可以從容應對。
缺點:
沒有排序,無法保證趨勢遞增。
UUID 往往是使用字串存儲,查詢的效率比較低。
儲存空間比較大,如果是海量資料庫,就需要考慮儲存量的問題。
傳輸資料量大
無法讀取。
優化方案:
為了解決 UUID 不可讀,可以使用 UUID to Int64 的方法。
第三部分: GUID
GUID:是微軟對 UUID 這個標準的實作。 UUID 還有其它各種實現,不只 GUID 一種。優缺點同 UUID。
第四部分: COMB
COMB(combine)型是資料庫特有的設計思想,可以理解為一種改進的GUID,它透過組合GUID 和系統時間,以使其在索引和檢索事有更優的效能。
資料庫中沒有 COMB 類型,它是 Jimmy Nilsson 在他的 “The Cost of GUIDs as Primary Keys” 一文中設計出來的。 \
COMB 資料類型的基本設計想法是這樣的:既然UniqueIdentifier 資料因毫無規律可言造成索引效率低下,影響了系統的效能,那麼我們能不能透過組合的方式,保留UniqueIdentifier 的前10 個位元組,用後6 個位元組表示GUID 產生的時間(DateTime),這樣我們將時間資訊與UniqueIdentifier 組合起來,在保留UniqueIdentifier 的唯一性的同時增加了有序性,以此來提高索引效率。
優點:
解決 UUID 無序的問題,在其主鍵產生方式中提供了 Comb 演算法 (combined guid/timestamp)。保留 GUID 的 10 個位元組,用另 6 個位元組表示 GUID 產生的時間 (DateTime)。
效能優於 UUID。
第五個部分: Twitter 的 snowflake 演算法
snowflake 是 Twitter 開源的分散式 ID 產生演算法,結果是一個 long 類型的 ID。其核心思想是:使用41bit 作為毫秒數,10bit 作為機器的ID(5 個bit 是資料中心,5 個bit 的機器ID),12bit 作為毫秒內的流水號(意味著每個節點在每毫秒可以產生4096 個ID),最後還有一個符號位,永遠是0。 snowflake 演算法可以根據自身專案的需要進行一定的修改。例如估算未來的資料中心個數,每個資料中心的機器數以及統一毫秒可以能的並發數來調整在演算法中所需的 bit 數。
優點:
不依賴資料庫,靈活方便,且效能優於資料庫。
ID 依照時間在單機上是遞增的。
缺點:
在單機上是遞增的,但是由於涉及到分散式環境,每台機器上的時鐘不可能完全同步,也許有時也會出現不是全域遞增的情況。
六、使用
這個使用起來是真的很方便:
npm install uuid --save
然後就可以使用啦!
const uuidv1 = require(‘uuid/v1‘); console.log(‘随机uuid字符串‘, uuidv1());
這樣,我們就可以印出來 uuid 字串了。每次的都不一樣。
以上是資料庫主鍵 ID 產生策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!

存儲過程是MySQL中的預編譯SQL語句集合,用於提高性能和簡化複雜操作。 1.提高性能:首次編譯後,後續調用無需重新編譯。 2.提高安全性:通過權限控制限制數據表訪問。 3.簡化複雜操作:將多條SQL語句組合,簡化應用層邏輯。

MySQL查詢緩存的工作原理是通過存儲SELECT查詢的結果,當相同查詢再次執行時,直接返回緩存結果。 1)查詢緩存提高數據庫讀取性能,通過哈希值查找緩存結果。 2)配置簡單,在MySQL配置文件中設置query_cache_type和query_cache_size。 3)使用SQL_NO_CACHE關鍵字可以禁用特定查詢的緩存。 4)在高頻更新環境中,查詢緩存可能導致性能瓶頸,需通過監控和調整參數優化使用。

MySQL被廣泛應用於各種項目中的原因包括:1.高性能與可擴展性,支持多種存儲引擎;2.易於使用和維護,配置簡單且工具豐富;3.豐富的生態系統,吸引大量社區和第三方工具支持;4.跨平台支持,適用於多種操作系統。

MySQL數據庫升級的步驟包括:1.備份數據庫,2.停止當前MySQL服務,3.安裝新版本MySQL,4.啟動新版本MySQL服務,5.恢復數據庫。升級過程需注意兼容性問題,並可使用高級工具如PerconaToolkit進行測試和優化。

MySQL備份策略包括邏輯備份、物理備份、增量備份、基於復制的備份和雲備份。 1.邏輯備份使用mysqldump導出數據庫結構和數據,適合小型數據庫和版本遷移。 2.物理備份通過複製數據文件,速度快且全面,但需數據庫一致性。 3.增量備份利用二進制日誌記錄變化,適用於大型數據庫。 4.基於復制的備份通過從服務器備份,減少對生產系統的影響。 5.雲備份如AmazonRDS提供自動化解決方案,但成本和控制需考慮。選擇策略時應考慮數據庫大小、停機容忍度、恢復時間和恢復點目標。

MySQLclusteringenhancesdatabaserobustnessandscalabilitybydistributingdataacrossmultiplenodes.ItusestheNDBenginefordatareplicationandfaulttolerance,ensuringhighavailability.Setupinvolvesconfiguringmanagement,data,andSQLnodes,withcarefulmonitoringandpe

在MySQL中優化數據庫模式設計可通過以下步驟提升性能:1.索引優化:在常用查詢列上創建索引,平衡查詢和插入更新的開銷。 2.表結構優化:通過規範化或反規範化減少數據冗餘,提高訪問效率。 3.數據類型選擇:使用合適的數據類型,如INT替代VARCHAR,減少存儲空間。 4.分區和分錶:對於大數據量,使用分區和分錶分散數據,提升查詢和維護效率。

tooptimizemysqlperformance,lofterTheSeSteps:1)inasemproperIndexingTospeedUpqueries,2)使用ExplaintplaintoAnalyzeandoptimizequeryPerformance,3)ActiveServerConfigurationStersLikeTlikeTlikeTlikeIkeLikeIkeIkeLikeIkeLikeIkeLikeIkeLikeNodb_buffer_pool_sizizeandmax_connections,4)


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。