<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      公司新來一個技術總監:禁止將 UUID 和雪花 ID 列入主鍵選型!

      0
      分享至

      釣友寶 (微信小程序):一款專門為 釣友 開發的 免費的 分享釣點地圖與實時天氣的軟件,地圖中標記了所有野釣、釣場、公共水域等的精確位置,支持導航、 預測釣魚位置的魚情 等功能。
      前言

      在 mysql 中設計表的時候,mysql 官方推薦不要使用 uuid 或者不連續不重復的雪花 id(long 形且唯一,單機遞增),而是推薦連續自增的主鍵 id,官方的推薦是 auto_increment,那么為什么不建議采用 uuid,使用 uuid 究竟有什么壞處?

      一、mysql 和程序實例

      1.1.要說明這個問題,我們首先來建立三張表

      分別是 user_auto_key,user_uuid,user_random_key,分別表示自動增長的主鍵,uuid 作為主鍵,隨機 key 作為主鍵,其它我們完全保持不變。

      根據控制變量法,我們只把每個表的主鍵使用不同的策略生成,而其他的字段完全一樣,然后測試一下表的插入速度和查詢速度:

      注:這里的隨機 key 其實是指用雪花算法算出來的前后不連續不重復無規律的 id:一串 18 位長度的 long 值

      id 自動生成表:


      用戶 uuid 表:


      隨機主鍵表:


      1.2.光有理論不行,直接上程序,使用 spring 的 jdbcTemplate 來實現增查測試:

      技術框架:springboot+jdbcTemplate+junit+hutool,程序的原理就是連接自己的測試數據庫,然后在相同的環境下寫入同等數量的數據,來分析一下 insert 插入的時間來進行綜合其效率,為了做到最真實的效果,所有的數據采用隨機生成,比如名字、郵箱、地址都是隨機生成。

      package com.wyq.mysqldemo; import cn.hutool.core.collection.CollectionUtil; import com.wyq.mysqldemo.databaseobject.UserKeyAuto; import com.wyq.mysqldemo.databaseobject.UserKeyRandom; import com.wyq.mysqldemo.databaseobject.UserKeyUUID; import com.wyq.mysqldemo.diffkeytest.AutoKeyTableService; import com.wyq.mysqldemo.diffkeytest.RandomKeyTableService; import com.wyq.mysqldemo.diffkeytest.UUIDKeyTableService; import com.wyq.mysqldemo.util.JdbcTemplateService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.util.StopWatch; import java.util.List; @SpringBootTest classMysqlDemoApplicationTests{     @Autowired     private JdbcTemplateService jdbcTemplateService;     @Autowired     private AutoKeyTableService autoKeyTableService;     @Autowired     private UUIDKeyTableService uuidKeyTableService;     @Autowired     private RandomKeyTableService randomKeyTableService;     @Test     voidtestDBTime(){         StopWatch stopwatch = new StopWatch("執行sql時間消耗");         /**          * auto_increment key任務          */         final String insertSql = "INSERT INTO user_key_auto(user_id,user_name,sex,address,city,email,state) VALUES(?,?,?,?,?,?,?)";         List insertData = autoKeyTableService.getInsertData();         stopwatch.start("自動生成key表任務開始");         long start1 = System.currentTimeMillis();         if (CollectionUtil.isNotEmpty(insertData)) {             boolean insertResult = jdbcTemplateService.insert(insertSql, insertData, false);             System.out.println(insertResult);         }         long end1 = System.currentTimeMillis();         System.out.println("auto key消耗的時間:" + (end1 - start1));         stopwatch.stop();         /**          * uudID的key          */         final String insertSql2 = "INSERT INTO user_uuid(id,user_id,user_name,sex,address,city,email,state) VALUES(?,?,?,?,?,?,?,?)";         List insertData2 = uuidKeyTableService.getInsertData();         stopwatch.start("UUID的key表任務開始");         long begin = System.currentTimeMillis();         if (CollectionUtil.isNotEmpty(insertData)) {             boolean insertResult = jdbcTemplateService.insert(insertSql2, insertData2, true);             System.out.println(insertResult);         }         long over = System.currentTimeMillis();         System.out.println("UUID key消耗的時間:" + (over - begin));         stopwatch.stop();         /**          * 隨機的long值key          */         final String insertSql3 = "INSERT INTO user_random_key(id,user_id,user_name,sex,address,city,email,state) VALUES(?,?,?,?,?,?,?,?)";         List insertData3 = randomKeyTableService.getInsertData();         stopwatch.start("隨機的long值key表任務開始");         Long start = System.currentTimeMillis();         if (CollectionUtil.isNotEmpty(insertData)) {             boolean insertResult = jdbcTemplateService.insert(insertSql3, insertData3, true);             System.out.println(insertResult);         }         Long end = System.currentTimeMillis();         System.out.println("隨機key任務消耗時間:" + (end - start));         stopwatch.stop();         String result = stopwatch.prettyPrint();         System.out.println(result);     }

      1.3.程序寫入結果

      user_key_auto 寫入結果:


      user_random_key 寫入結果:


      user_uuid 表寫入結果:


      1.4.效率測試結果


      在已有數據量為 130W 的時候:我們再來測試一下插入 10w 數據,看看會有什么結果:


      可以看出在數據量 100W 左右的時候,uuid 的插入效率墊底,并且在后序增加了 130W 的數據,uudi 的時間又直線下降。

      時間占用量總體可以得出的效率排名為:auto_key>random_key>uuid,uuid 的效率最低,在數據量較大的情況下,效率直線下滑。那么為什么會出現這樣的現象呢?帶著疑問,我們來探討一下這個問題。

      二、使用 uuid 和自增 id 的索引結構對比

      2.1.使用自增 id 的內部結構


      自增的主鍵的值是順序的,所以 Innodb 把每一條記錄都存儲在一條記錄的后面。當達到頁面的最大填充因子時候(innodb 默認的最大填充因子是頁大小的 15/16,會留出 1/16 的空間留作以后的修改):

      • 下一條記錄就會寫入新的頁中,一旦數據按照這種順序的方式加載,主鍵頁就會近乎于順序的記錄填滿,提升了頁面的最大填充率,不會有頁的浪費;

      • 新插入的行一定會在原有的最大數據行下一行,mysql 定位和尋址很快,不會為計算新行的位置而做出額外的消耗;

      • 減少了頁分裂和碎片的產生。

      2.2.使用 uuid 的索引內部結構


      因為 uuid 相對順序的自增 id 來說是毫無規律可言的,新行的值不一定要比之前的主鍵的值要大,所以 innodb 無法做到總是把新行插入到索引的最后,而是需要為新行尋找新的合適的位置從而來分配新的空間。

      這個過程需要做很多額外的操作,數據的毫無順序會導致數據分布散亂,將會導致以下的問題:

      寫入的目標頁很可能已經刷新到磁盤上并且從緩存上移除,或者還沒有被加載到緩存中,innodb 在插入之前不得不先找到并從磁盤讀取目標頁到內存中,這將導致大量的隨機 IO

      因為寫入是亂序的,innodb 不得不頻繁的做頁分裂操作,以便為新的行分配空間,頁分裂導致移動大量的數據,一次插入最少需要修改三個頁以上

      由于頻繁的頁分裂,頁會變得稀疏并被不規則的填充,最終會導致數據會有碎片

      在把隨機值(uuid 和雪花 id)載入到聚簇索引(innodb 默認的索引類型)以后,有時候會需要做一次 OPTIMEIZE TABLE 來重建表并優化頁的填充,這將又需要一定的時間消耗。

      結論:使用 innodb 應該盡可能的按主鍵的自增順序插入,并且盡可能使用單調的增加的聚簇鍵的值來插入新行

      2.3.使用自增 id 的缺點

      那么使用自增的 id 就完全沒有壞處了嗎?并不是,自增 id 也會存在以下幾點問題:

      別人一旦爬取你的數據庫,就可以根據數據庫的自增 id 獲取到你的業務增長信息,很容易分析出你的經營情況

      對于高并發的負載,innodb 在按主鍵進行插入的時候會造成明顯的鎖爭用,主鍵的上界會成為爭搶的熱點,因為所有的插入都發生在這里,并發插入會導致間隙鎖競爭

      Auto_Increment 鎖機制會造成自增鎖的搶奪,有一定的性能損失。

      附:Auto_increment 的鎖爭搶問題,如果要改善需要調優 innodb_autoinc_lock_mode 的配置
      三、總結

      本篇博客首先從開篇的提出問題,建表到使用 jdbcTemplate 去測試不同 id 的生成策略在大數據量的數據插入表現,然后分析了 id 的機制不同在 mysql 的索引結構以及優缺點,深入的解釋了為何 uuid 和隨機不重復 id 在數據插入中的性能損耗,詳細的解釋了這個問題。

      在實際的開發中還是根據 mysql 的官方推薦最好使用自增 id,mysql 博大精深,內部還有很多值得優化的點需要我們學習。

      附:本篇博客 demo 地址:https://gitee.com/Yrion/mysqlIdDemo

      Java精選面試題 (微信小程序):5000+道面試題和選擇題,包含Java基礎、MQ、Redis、SpringBoot、Elasticsearch、Docker、K8s、Flink、Spark、架構設計、大廠真題等,在線隨時刷題!
      來源:https://www.cnblogs.com/wyq178/p/12548864.html

      公眾號“Java精選”所發表內容注明來源的,版權歸原出處所有(無法查證版權的或者未注明出處的均來自網絡,系轉載,轉載的目的在于傳遞更多信息,版權屬于原作者。如有侵權,請聯系,筆者會第一時間刪除處理!

      最近有很多人問,有沒有讀者或者摸魚交流群!加入方式很簡單,公眾號Java精選,回復“加群”,即可入群!

      文章有幫助的話,點在看,轉發吧!

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      水貨實錘?才一年就全面下滑,這可是狀元啊,老鷹虧大發了

      水貨實錘?才一年就全面下滑,這可是狀元啊,老鷹虧大發了

      球童無忌
      2025-12-20 23:40:16
      輸吉林發布會!劉煒將防守甩鍋納托爾,不滿籃板,西爾扎提談失誤

      輸吉林發布會!劉煒將防守甩鍋納托爾,不滿籃板,西爾扎提談失誤

      籃球資訊達人
      2025-12-21 02:56:57
      停飛中國航班,拒絕中國游客,這個在東南亞小國”處處和中國作對

      停飛中國航班,拒絕中國游客,這個在東南亞小國”處處和中國作對

      南權先生
      2025-12-20 17:01:37
      68歲青島市人大常委會原主任被查,今年已有61名中管干部落馬

      68歲青島市人大常委會原主任被查,今年已有61名中管干部落馬

      上觀新聞
      2025-12-19 18:57:02
      寧波衛健委回應小洛熙事件最新進展:醫療事故鑒定仍在進行

      寧波衛健委回應小洛熙事件最新進展:醫療事故鑒定仍在進行

      極目新聞
      2025-12-20 19:49:35
      北京阿姨20年守茅臺股票:90萬本金,分紅326萬,成本歸零!

      北京阿姨20年守茅臺股票:90萬本金,分紅326萬,成本歸零!

      趣文說娛
      2025-12-20 18:29:20
      2026央視跨年晚會陣容曝光,看完明星名單難掩激動,該來的都來了

      2026央視跨年晚會陣容曝光,看完明星名單難掩激動,該來的都來了

      阿纂看事
      2025-12-19 14:38:58
      僅差32次!僅差45個!老詹迎來兩項神級里程碑,愈老愈妖

      僅差32次!僅差45個!老詹迎來兩項神級里程碑,愈老愈妖

      世界體育圈
      2025-12-20 13:22:08
      掛斷中方電話后,馬杜羅下令出兵,油輪保衛戰打響,白宮措辭變強

      掛斷中方電話后,馬杜羅下令出兵,油輪保衛戰打響,白宮措辭變強

      策前論
      2025-12-20 23:12:33
      12架日機攜48導彈直撲遼寧艦,美媒直接報喪:被解放軍全面碾壓?

      12架日機攜48導彈直撲遼寧艦,美媒直接報喪:被解放軍全面碾壓?

      科普100克克
      2025-12-16 16:26:18
      央企“最牛女副處長”落馬:兩年與上司開房410次,細節曝光

      央企“最牛女副處長”落馬:兩年與上司開房410次,細節曝光

      西門老爹
      2025-12-16 15:35:31
      普京拒付金正恩派兵報酬,因朝鮮軍隊戰績不佳,僅支付20%報酬

      普京拒付金正恩派兵報酬,因朝鮮軍隊戰績不佳,僅支付20%報酬

      環球熱點快評
      2025-12-17 09:19:03
      上海一對情侶戀愛時男方說“我養你”,分手后女方以此為證,拒絕返還40余萬元!測謊實驗后,法院判了

      上海一對情侶戀愛時男方說“我養你”,分手后女方以此為證,拒絕返還40余萬元!測謊實驗后,法院判了

      都市快報橙柿互動
      2025-12-20 09:35:12
      商K上線了新花樣…

      商K上線了新花樣…

      微微熱評
      2025-12-20 15:22:00
      明宣宗朱瞻基陵墓,下周一開放

      明宣宗朱瞻基陵墓,下周一開放

      上觀新聞
      2025-12-20 16:31:19
      市監局通報“南極磷蝦油”事件:已成立聯合調查組進駐北京同仁堂(四川)健康藥業有限公司開展調查,已對該企業立案

      市監局通報“南極磷蝦油”事件:已成立聯合調查組進駐北京同仁堂(四川)健康藥業有限公司開展調查,已對該企業立案

      極目新聞
      2025-12-20 19:28:56
      國乒教練組巨震,林詩棟新教練讓人意外,王曼昱主管教練情理之中

      國乒教練組巨震,林詩棟新教練讓人意外,王曼昱主管教練情理之中

      月亮的麥片
      2025-12-20 21:18:01
      繼父、同母異父弟弟?墜亡女教師身世曝光,這才是她走絕路的真相

      繼父、同母異父弟弟?墜亡女教師身世曝光,這才是她走絕路的真相

      知法而形
      2025-12-19 23:33:57
      1984年他一聲令下,把老山幾千噸炮彈當水潑,2019年葬禮現場,昔日部下已是軍委副主席,含淚送別這位鐵血師長!

      1984年他一聲令下,把老山幾千噸炮彈當水潑,2019年葬禮現場,昔日部下已是軍委副主席,含淚送別這位鐵血師長!

      史海孤雁
      2025-12-17 16:50:24
      凡人微光 | “童”行有你

      凡人微光 | “童”行有你

      新華社
      2025-12-20 13:14:20
      2025-12-21 05:43:00
      Java精選
      Java精選
      一場永遠也演不完的戲
      1764文章數 3859關注度
      往期回顧 全部

      科技要聞

      許四清:具身智能的"ChatGPT時刻"還未到來

      頭條要聞

      高市早苗擔心被邊緣化 要趕在特朗普訪華前行動

      頭條要聞

      高市早苗擔心被邊緣化 要趕在特朗普訪華前行動

      體育要聞

      我開了20年大巴,現在是一名西甲主帥

      娛樂要聞

      2026央視跨年晚會陣容曝光,豪華陣仗

      財經要聞

      求解“地方財政困難”

      汽車要聞

      嵐圖推進L3量產測試 已完成11萬公里實際道路驗證

      態度原創

      藝術
      本地
      時尚
      公開課
      軍事航空

      藝術要聞

      中國老香煙品牌,你知道多少?

      本地新聞

      云游安徽|訪黃山云海古村,讀一城山水風骨

      最顯腿細的騎士靴,誰穿誰是腿精

      公開課

      李玫瑾:為什么性格比能力更重要?

      軍事要聞

      澤連斯基:前線局勢愈發艱難

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 丰满少妇人妻无码| 日日夜干| 集安市| 日韩成人无码影院| 青青青青青手机视频在线观看视频| 成年无码av片在线蜜芽| 婷婷综合久久| 亚洲国产精选| 国产性天天综合网| 欧美精品黑人粗大| 人妻在线无码一区二区三区| 欧美第3页| A成片人| 国产粉嫩高中无套进入| 办公室强奷漂亮少妇视频| 亚洲sm另类一区二区三区| chinese国产av| 精品?一区?卡| 亚洲乱码中文字幕综合| 国产成人免费一区二区三区| 亚洲天堂男人| 聂荣县| 平阴县| 精品国产欧美一区二区三区在线| 少妇无码视频| 通许县| 久久综合综合久久综合| 国产精品扒开腿做爽爽爽a片唱戏| 美女一区二区三区在线观看视频| 大色欧美| 狠狠色狠狠色综合| 亚洲色五月| 久久精品99久久久久久久久| 遵化市| 女人扒开腿让男人桶到爽| 全球成人中文在线| 国产熟妇| 日韩人妻中文字幕一区| 亚洲国产区男人本色| 97精品国产91久久久久久久| 91超碰在|