雪花算法生成的主鍵存在哪些問題,為什么不能使用自增ID或者UUID做MySQL的主鍵

MySQL 分布式架構中的主鍵選擇:自增ID、UUID與雪花算法

為什么MySQL分布式架構中不能使用自增主鍵?

在分布式架構中,自增主鍵存在以下問題:

  1. 主鍵沖突風險:多個數據庫實例同時生成自增主鍵會導致ID重復
  2. 分片不均勻
    ? 采用范圍分片時會出現"尾部熱點"現象,壓力集中在某個分片
    ? 無法實現負載均衡,新數據只能寫入當前分片
  3. 數據合并困難:合并多個數據庫時,自增主鍵會重復
  4. 性能瓶頸:自增鎖在高并發場景下會成為性能瓶頸
  5. 安全性問題:自增ID容易被猜測,可能被用于惡意爬取數據

UUID作為主鍵的優缺點

優點

? 全局唯一性:幾乎可以保證全球范圍內的唯一性
? 分布式友好:無需協調即可在不同節點生成
? 安全性:隨機生成的UUID難以被猜測

缺點

? 存儲空間大:16字節(128位),是自增ID(通常4字節)的4倍
? 索引性能差
? 無序插入導致B+樹頻繁分裂和平衡
? 增加索引大小,降低緩存命中率
? 可讀性差:長字符串形式不利于人工識別和調試
? 碎片化問題:隨機插入導致磁盤碎片化

MySQL 8.0優化:可使用UUID_TO_BIN函數將UUID轉換為16字節二進制并排序,性能接近自增ID

雪花算法(SnowFlake)詳解

原理

雪花算法生成64位長整型ID,結構如下:

0 | 0000000 00000000 00000000 00000000 00000000 | 00000 | 00000 | 00000000 0000
  1. 1位符號位:固定為0(正數)
  2. 41位時間戳:毫秒級時間,可用69年(從1970算起)
  3. 10位機器標識
    ? 5位數據中心ID(32個可能值)
    ? 5位工作機器ID(32個可能值)
  4. 12位序列號:同一毫秒內的計數器(4096個值/ms/機器)

優勢

  1. 全局唯一:通過時間戳+機器ID+序列號組合保證
  2. 有序遞增:基于時間戳,有利于索引和排序
  3. 高性能:本地生成,每秒可生成數百萬ID
  4. 不依賴第三方:算法簡單,內存中完成
  5. 分布式友好:支持最多1024個節點(10位機器標識)

不足與解決方案

  1. 時鐘回撥問題
    ? 問題:服務器時間被調回導致重復ID
    ? 解決方案
    ? 直接拋出異常,停止服務
    ? 記錄最近時間戳,回撥時等待
    ? 使用擴展位記錄時鐘序列(3位時鐘序列+7位機器ID)
    ? 采用Leaf、UidGenerator等改進方案

  2. 機器ID限制
    ? 問題:10位僅支持1024個節點
    ? 解決方案
    ? 預分配ID(適合固定節點)
    ? 動態分配(使用Redis/Zookeeper存儲ID)
    ? 擴展位數(犧牲部分時間戳或序列號位)

  3. 時間戳耗盡
    ? 問題:41位時間戳約69年后耗盡
    ? 解決方案:調整起始時間(如使用系統上線時間而非1970)

代碼示例(Java)

public class SnowflakeIdGenerator {private final long twepoch = 1577836800000L; // 自定義起始時間(2020-01-01)private final long workerIdBits = 5L;private final long datacenterIdBits = 5L;private final long maxWorkerId = -1L ^ (-1L << workerIdBits);private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);private final long sequenceBits = 12L;private final long workerIdShift = sequenceBits;private final long datacenterIdShift = sequenceBits + workerIdBits;private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;private final long sequenceMask = -1L ^ (-1L << sequenceBits);private long workerId;private long datacenterId;private long sequence = 0L;private long lastTimestamp = -1L;public SnowflakeIdGenerator(long workerId, long datacenterId) {// 參數校驗this.workerId = workerId;this.datacenterId = datacenterId;}public synchronized long nextId() {long timestamp = timeGen();// 處理時鐘回撥if (timestamp < lastTimestamp) {throw new RuntimeException("Clock moved backwards");}if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - twepoch) << timestampLeftShift)| (datacenterId << datacenterIdShift)| (workerId << workerIdShift)| sequence;}// 其他輔助方法...
}

總結對比

特性自增IDUUID雪花算法
唯一性單機唯一全局唯一全局唯一
有序性嚴格有序完全無序時間有序
存儲空間4-8字節16字節8字節
分布式支持不支持支持支持
生成方式數據庫生成應用生成應用生成
性能影響自增鎖瓶頸索引分裂時鐘依賴
適用場景單機MySQL簡單分布式系統高并發分布式系統

推薦選擇
? 單機系統:自增ID
? 簡單分布式系統:MySQL 8.0的有序UUID
? 高并發分布式系統:雪花算法或其改進版(如Leaf)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74256.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74256.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74256.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RapidJSON 處理 JSON(高性能 C++ 庫)(四)

第四部分:RapidJSON 處理 JSON(高性能 C++ 庫) ?? 快速掌握 JSON!文章 + 視頻雙管齊下 ?? 如果你覺得閱讀文章太慢,或者更喜歡 邊看邊學 的方式,不妨直接觀看我錄制的 RapidJSON 課程視頻!?? 視頻里會用更直觀的方式講解 RapidJSON 的核心概念、實戰技巧,并配有…

chromem-go + ollama + bge-m3 進行文檔向量嵌入和查詢

Ollama 安裝 https://ollama.com/download Ollama 運行嵌入模型 bge-m3:latest ollama run bge-m3:latestchromem-go 文檔嵌入和查詢 package mainimport ("context""fmt""runtime""github.com/philippgille/chromem-go" )func ma…

【LeetCode 題解】數據庫:180. 連續出現的數字

一、問題描述 給定一個Logs表&#xff0c;包含自增 ID 和數字字段&#xff1a; CREATE TABLE Logs (id INT PRIMARY KEY AUTO_INCREMENT,num VARCHAR(50) );要求編寫 SQL 查詢&#xff0c;找出所有至少連續出現三次的數字。例如&#xff1a; --------- | id | num | -------…

MaxEnt模型進階:基于R語言自動化與GIS空間建模的物種棲息地精準預測

生物多樣性的空間分布規律及其對環境變化的響應機制&#xff0c;是生態學與地理學研究的前沿議題。在氣候變化加劇和人類活動干擾的雙重壓力下&#xff0c;如何精準預測物種潛在分布范圍、識別關鍵環境驅動因子&#xff0c;已成為制定生物保護策略的核心科學問題。物種分布模型…

緩存雪崩解決方案:二級緩存VS隨機TTL

背景 在學習緩存雪崩的時候&#xff0c;了解到有二級緩存和隨機TTL兩個解決方案&#xff0c;但是在學習之后&#xff0c;個人認為二級緩存本質上還是利用兩層緩存的過期時間不一致來實現緩存過期時間隨機化&#xff0c;這不就是和隨機TTL一樣嗎&#xff0c;故有了這篇思考&…

Android View事件分發機制深度解析

在Android面試中&#xff0c;關于View事件分發機制的考察往往不僅限于基礎流程&#xff0c;更關注底層原理、性能優化和實際應用場景。以下是針對面試的全面回答策略&#xff1a; 一、基礎回答框架 核心三要素&#xff1a; 傳遞流程 "事件分發遵循Activity → Window →…

2829. k-avoiding 數組的最小總和

2829. k-avoiding 數組的最小總和 題目鏈接&#xff1a;2829. k-avoiding 數組的最小總和 代碼如下&#xff1a; class Solution { public:int minimumSum(int n, int k) {int m min(k / 2, n);return (m * (m 1) (k * 2 n - m - 1) * (n - m)) / 2;} };

phpStorm2021.3.3在windows系統上配置Xdebug調試

開始 首先根據PHP的版本下載并安裝對應的Xdebug擴展在phpStorm工具中找到設置添加服務添加php web page配置完信息后 首先根據PHP的版本下載并安裝對應的Xdebug擴展 我使用的是phpStudy工具&#xff0c;直接在php對應的版本中開啟xdebug擴展&#xff0c; 并在php.ini中添加如下…

LabVIEW永磁同步電機性能測試系統

開發了一種基于LabVIEW的永磁同步電機&#xff08;PMSM&#xff09;性能測試系統的設計及應用。該系統針對新能源汽車使用的電機進行穩態性能測試&#xff0c;解決了傳統測試方法成本高、效率低的問題&#xff0c;實現了測試自動化&#xff0c;提高了數據的準確性和客觀性。 ?…

谷粒商城:Redisson

目錄 Redisson 整合Redisson RLock RReadWriteLock RSemaphore RCountDownLatch 優化三級分類緩存 緩存一致性問題 雙寫模式 失效模式 臟數據解決 Redisson 提供redis分布式鎖&#xff08;Distributed locks with Redis&#xff09;的java客戶端 整合Redisson 引入 …

Linux系統調用編程

目錄 一. 理解進程和線程的概念。并在Linux系統下進行相應操作 1.1概念 1.1.1進程(Process) 1.1.2 線程(Thread) 1.2操作 1.2.1用 ps -a 命令查看系統中各進程的編號pid 1.2.2用kill 命令終止一個進程pid 二. 解釋Linux的“虛擬內存管理”&#xff0c;它與stm32中的 真…

25-智慧旅游系統(協同算法)三端

介紹 技術&#xff1a; 基于 B/S 架構 SpringBootMySQLLayuivue 環境&#xff1a; Idea mysql maven jdk1.8 node 管理端功能 首頁展示圖表&#xff1a;以數據可視化方式展示關鍵業務數據。 用戶管理&#xff1a;管理系統用戶&#xff0c;包括查看、編輯等操作。 供應商管…

【stm32--HAL庫DMA+USART+空閑中斷不定長收發數據】

串口通信-Hal庫實現不定長度收發&#xff0c;DMAUSART DMA串口STM32CUBEMX配置&#xff08;工程創建&#xff09;基礎配置時鐘配置工程配置 代碼編寫現象 DMA 在正式配置之前&#xff0c;我們先來一起簡單了解一下DMA。DMA&#xff08;Direct Memory Access&#xff0c;直接內…

沉浸式體驗測評|AI Ville:我在Web3小鎮“生活”了一周

最近&#xff0c;我在朋友的推薦下&#xff0c;體驗了 aivillebot 的項目。起初&#xff0c;我只是抱著試試看的心態&#xff0c;心想這不就是個 Web3 版的《星露谷物語》嗎&#xff1f; 但是一周下來&#xff0c;我發現這個虛擬小鎮也沒那么簡單——里面的居民不是目前端游或鏈…

FPGA學習-基于 DE2-115 板的 Verilog 分秒計數器設計與按鍵功能實現

一、核心功能設計 按鍵暫停/繼續&#xff1a;通過KEY1控制計時狀態 按鍵消抖處理&#xff1a;20ms消抖周期消除機械抖動 硬件資源分配&#xff1a;符合DE2-115開發板引腳規范 二、核心模塊實現詳解 1. 頂層模塊&#xff08;counter&#xff09; module counter(input CL…

后端開發 SpringBoot 工程模板

概述 本篇文章主要記錄如何開發一個通用的 SpringBoot 工程開發框架的項目模板&#xff0c;這樣后續需要開發項目時就可以直接開箱直用了&#xff0c;省區了很多重復步驟。 項目初始化 創建項目&#xff1a; 按照我的選項來選&#xff0c;然后點擊 create&#xff0c;等待文…

OpenCv(五)——邊緣檢測

目錄 邊緣檢測 一、sobel算子邊緣檢測 &#xff08;1&#xff09;原理 1、X軸方向的邊緣檢測 2、Y軸方向的邊緣檢測 &#xff08;2&#xff09;sobel算子參數 &#xff08;3&#xff09;X軸方向邊緣檢測代碼演示 1、顯示圓的圖像 2、x方向上的邊緣檢測&#xf…

無人機數據鏈技術及運行方式詳解!

一、無人機數據鏈技術要點 1. 通信傳輸技術 頻段選擇&#xff1a; 常用頻段包括 L波段&#xff08;1-2 GHz&#xff09;、C波段&#xff08;4-8 GHz&#xff09;、Ku/K波段&#xff08;12-40 GHz&#xff09;&#xff0c;不同頻段在傳輸距離、帶寬和抗干擾性間權衡。 低…

AI Agent 實戰:搭建個人在線旅游助手

AI Agent 實戰&#xff1a;搭建個人在線旅游助手 本次實驗中&#xff0c;我們將繼續探索 Agent 的提示詞&#xff0c;學習更加規范的提示詞撰寫方法。 本實驗中你將掌握的知識點 使用 Dify 構建 Agent 的方法結構化的提示詞撰寫技巧變量的使用方法 1. 準備 在新建 Agent 之…

檢索增強生成(RAG):強化 AI 智能體的知識 “武裝”

技術點目錄 第一章、智能體(Agent)入門第二章、基于字節Coze 構建智能體(Agent)第三章、基于其他平臺構建智能體&#xff08;Agent&#xff09;第四章、國內外智能體(Agent)經典案例詳解第五章、大語言模型應用開發框架LangChain入門第六章、基于LangChain的大模型API接入第七章…