數據庫主鍵選擇策略分析

為什么不推薦使用數據庫自增主鍵?

  1. 分庫分表問題

    • 自增ID在分庫分表場景下會導致ID沖突
    • 需要額外機制(如步長設置)來保證全局唯一,增加系統復雜度
  2. 安全性問題

    • 自增ID容易暴露業務量(如訂單號連續)
    • 可能被惡意爬取數據
  3. 分布式系統限制

    • 依賴數據庫實現,在分布式系統中可能成為性能瓶頸
    • 高并發場景下獲取ID可能產生競爭
  4. 數據遷移困難

    • 不同數據庫的自增機制可能不兼容
    • 合并數據時容易產生沖突

為什么不推薦使用UUID作為主鍵?

  1. 存儲空間大

    • UUID通常需要32個字符(16字節),比長整型(8字節)占用更多空間
    • 導致索引占用更多內存,降低查詢性能
  2. 無序性問題

    • UUID是無序的,導致B+樹索引頻繁分裂
    • 插入性能下降,產生更多磁盤碎片
  3. 可讀性差

    • 對人類不友好,難以記憶和識別
  4. 索引效率低

    • 較大的鍵值導致索引層級增加
    • 范圍查詢效率降低

雪花算法(Snowflake)存在的問題

  1. 時鐘回撥問題

    • 依賴系統時鐘,時鐘回撥會導致ID重復
    • 需要額外處理邏輯,增加系統復雜度
  2. 分布式環境配置

    • 需要確保workerId在集群中唯一
    • 動態擴容時workerId分配可能成為問題
  3. ID長度限制

    • 標準的64位雪花ID可能在某些場景下不夠用
    • 擴展位數會影響兼容性
  4. 時間戳依賴

    • 如果系統運行時間超過69年(時間戳部分耗盡),需要特殊處理
  5. 數據傾斜問題

    • 短時間內大量生成ID可能導致數據熱點

主鍵選擇建議

  1. 單機系統

    • 可以考慮自增主鍵,簡單高效
  2. 分布式系統

    • 推薦使用改進版的雪花算法(如美團的Leaf、百度的UidGenerator)
    • 也可以考慮Redis生成ID或數據庫號段模式
    • 將序列號進行修改防止數據傾斜(如將時間戳最后一位賦值給序列號最后一位);
  3. ?特殊需求場景

    • 需要隱藏業務信息的可以使用哈希ID
    • 需要可讀性的可以使用業務編號+隨機數組合
  4. NoSQL系統

    • 可以充分利用各數據庫特有的ID生成機制
    • 如MongoDB的ObjectId

每種方案都有其適用場景,應根據具體業務需求、數據規模和系統架構來選擇最合適的主鍵策略。

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

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

相關文章

線性代數理論——狀態空間的相關概念以及由系統的輸入輸出導出狀態空間描述

線性代數理論——狀態空間 狀態:動態系統的狀態就是指系統的過去、現在、將來的運動狀況,精確的說就是狀態需要一組必要而充分的數據來表明。 狀態變量:可以表達系統運動狀態的變量都是狀態變量。 狀態變量組:可以完全表征系統在時…

【GaussDB】排查應用高可用切換出現數據庫整體卡頓及報錯自治事務無法創建的問題

【GaussDB】排查應用高可用切換出現數據庫整體卡頓及報錯自治事務無法創建的問題 背景 某客戶在做應用程序的高可用切換測試,在應用程序中,收到了來自數據庫的報錯,不能創建自治事務 ERROR: autonomous transaction failed to create auton…

shell腳本第五階段---shell函數與正則表達式

學習目標掌握case語句的基本語法結構掌握函數的定義以及調用掌握常用的正則表達式元字符含義一、case語句case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。case var in 定義變量;var代表變量名…

164.在 Vue3 中使用 OpenLayers 加載 Esri 地圖(多種形式)

適配:Vue 3 Vite TypeScript(也兼容 JS) 地圖引擎:OpenLayers v10 目標:一次性學會 多種 Esri 底圖加載方式、注記疊加、動態切換、令牌(Token)鑒權、常見坑位排查。一、效果預覽二、為什么選…

深入了解Flink核心:Slot資源管理機制

TaskExecutor、Task 和 Slot 簡單來說,它們的關系可以比作:TaskExecutor:一個工廠,擁有固定的生產資源。TaskSlot:工廠里的一個工位。每個工位都預先分配了一份獨立的資源(主要是內存)。Task&am…

java web 練習demo。生成簡單驗證碼前端是jsp

目錄結構 demo\ ├── WEB-INF\ │ └── weblogic.xml # WebLogic服務器配置文件 ├── demo.iml # IntelliJ IDEA項目配置文件 ├── lib\ # Java EE核心依賴庫 │ ├── javax.annotation.jar │ ├── javax.ejb.jar │ ├── javax.…

擁抱智能高效翻譯 ——8 款視頻翻譯工具深度測評

前陣子幫知識博主做跨境視頻翻譯,踩了不少坑:把 “內卷” 直譯成 “involution” 讓海外觀眾困惑,多語種版本趕工 3 天只出 2 種,還得手動核對 “碳中和”“非遺” 這類特色詞的譯法;用傳統工具譯完,視頻要…

[知識點記錄]SQLite 數據庫和MySQL 數據庫有什么區別?

核心區別:一個“內嵌”,一個“獨立”SQLite (你的個人筆記本)本質: 它是“無服務器”的,或者叫“內嵌式”數據庫。它不需要一個獨立的程序一直在后臺運行。你的應用程序(比如Strapi)直接就能讀寫它的數據庫…

【Spark Core】(二)RDD編程入門

目錄1 程序入口&#xff1a;SparkContext對象2 RDD的創建2.1 本地創建2.2 讀取文件創建3 RDD算子4 常用Transform算子4.1 map算子4.2 flatMap算子4.3 reduceBykey算子4.4 mapValues算子<實例> WordCount4.5 groupBy算子4.6 filter算子4.7 distinct算子4.8 union算子4.9 j…

java IDEA run/Debug異常:“jdk1.8injava.exe“ CreateProcess error=206, 文件名或擴展名太長

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#,Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發…

Java 函數編程之【過濾器filter()合并】【predicate(斷言)】與【謂詞邏輯】

Java函數式編程之【過濾器filter合并】【predicate&#xff08;斷言&#xff09;】與【謂詞邏輯】一、合并多個過濾器filter &#xff08;Lambda版本&#xff09;二、合并多個過濾器filter &#xff08;謂詞邏輯&#xff08;Predicate&#xff09;版本&#xff09;&#xff08;…

CentOS10安裝RabbitMQ

1.下載資源 &#xff08;1&#xff09;下載erlang-rpm 注意&#xff1a;按照圖片中的下載&#xff0c;用綠色三角形指向的是重點關注的。 網址&#xff1a; erlang-rpmhttps://github.com/rabbitmq/erlang-rpm/releases &#xff08;2&#xff09;下載rabbitmq-server 注…

JVM——八股文

1. JDK, JRE和JVM的關系JDK JRE Java開發工具JRE JVM Java核心類庫JDK供Java程序開發人員開發軟件&#xff0c;JRE供客戶使用&#xff0c;只需要JVM運行環境即可。JVM運行的是class字節碼&#xff0c;不僅能運行Java代碼&#xff0c;還能運行其他語言&#xff0c;只要語言能…

騎行把帶定期換,維樂 Skin Wrap 把帶煥新騎行

在公路騎行的裝備體系里&#xff0c;把帶是最易被忽視卻至關重要的“消耗品”。它是騎手手部與車身的直接連接&#xff0c;每一次轉向、變速、剎車&#xff0c;都需通過把帶傳遞力量與操控意圖&#xff1b;同時&#xff0c;它還承擔著吸汗、減震、保護車把的作用。可長期使用后…

LeetCode100-73矩陣置零

本文基于各個大佬的文章 上點關注下點贊&#xff0c;明天一定更燦爛&#xff01; 前言 Python基礎好像會了又好像沒會&#xff0c;所有我直接開始刷leetcode一邊抄樣例代碼一邊學習吧。本系列文章用來記錄學習中的思考&#xff0c;寫給自己看的&#xff0c;也歡迎大家在評論區指…

寧波市第八屆網絡安全大賽 -- Crypto -- WriteUp

寧波市第八屆網絡安全大賽 – Crypto – WriteUp Three-prime RSA task import gmpy2 from Crypto.Util.number import *from secret import flagp getPrime(512) q getPrime(512) r getPrime(512) n p * q * r random_num getPrime(28) D ((p q r) * random_num) % n …

大語言模型 (LLM) 與多模態大模型 (MLM)

文章目錄概述&#xff1a;從“模型”到“大”模型1、大語言模型 (Large Language Model, LLM)1.1 定義與概述關鍵特征&#xff1a;1.2 核心技術與架構Transformer架構自注意力機制 (Self-Attention)1.3 訓練過程1.4 工作原理2. 多模態大模型 (Multimodal Large Model, MLM)2.1 …

HTML應用指南:利用GET請求獲取全國招商銀行網點位置信息

招商銀行&#xff08;China Merchants Bank, CMB&#xff09;作為中國領先的股份制商業銀行&#xff0c;始終堅持“以客戶為中心”的服務理念&#xff0c;致力于為個人客戶、企業客戶及機構客戶提供專業、高效、便捷的綜合金融服務。依托“輕型銀行”戰略與“金融科技銀行”建設…

JVM性能監控工具的使用

了解JVM性能監控工具并能熟練使用&#xff0c;是Java開發者進階的必備技能。下面本文將為你介紹一些主流的JVM性能監控工具及其使用方法&#xff0c;并通過一些場景案例來分析如何應用這些工具解決實際問題。 &#x1f6e0;? JVM性能監控與調優工具指南 ? 工具概覽 以下是幾款…

【工作】一些找工作需要了解避雷的知識

面試前 1.公司的具體情況 公司全稱&#xff0c;辦公地點&#xff0c;涉及崗位 要求hr做個簡單的公司介紹 2.崗位職責/業務方向 工作內容、公司業務 3.薪資待遇&#xff0c;構成&#xff0c;底薪&#xff0c;五險一金 問一下工資范圍 底薪 &#xff08;有責&#xff0c;無…