最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中UUID主鍵的優(yōu)化小結

 更新時間:2024年09月03日 10:39:07   作者:V1ncent Chen  
UUID可以唯一標識記錄,因此有些場景可能會用來作為表的主鍵,本文主要介紹了MySQL中UUID主鍵的優(yōu)化小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

UUID(Universally Unique IDentifier 通用唯一標識符),是一種常用的唯一標識符,在MySQL中,可以利用函數(shù)uuid()來生產(chǎn)UUID。因為UUID可以唯一標識記錄,因此有些場景可能會用來作為表的主鍵,但直接用UUID來作為主鍵可能存在性能缺陷,我們需要采取一些優(yōu)化手段。

一、UUID主鍵的缺陷

在MySQL中,innodb是按照表的聚簇索引(主鍵)來組織數(shù)據(jù)存儲的,也就是主鍵的順序決定了數(shù)據(jù)存儲的順序。這也是為什么我們通常推薦用整型,自增的數(shù)字來作為表的主鍵,當新數(shù)據(jù)插入時,主鍵一定是最大的,只要放在葉子層中最后的數(shù)據(jù)頁即可,對已有的數(shù)據(jù)不會有影響。

而如果用UUID來做主鍵,則會有2個缺陷:

  • UUID的值是隨機的,因此新插入的數(shù)據(jù)有可能會插到已有數(shù)據(jù)的中間,這會導致整個索引樹的重新平衡和節(jié)點分裂,降低插入性能,數(shù)據(jù)量越大越嚴重。
  • UUID是字符型,相對數(shù)字占用的存儲空間很大,這意味著主鍵很大,而主鍵又會附加到所有的二級索引中,因此所有的索引都很臃腫,消耗額外的磁盤和內(nèi)存資源,降低查詢性能。

UUID的生成方式有很多版本,這里舉2個最常用的:

  • UUID V1: 通過時間戳和MAC地址來生成,可以生成順序的UUID。
  • UUID V4: 通過隨機數(shù)來生成,無法生成順序的UUID。

MySQL自帶的函數(shù)uuid()是通過UUIDv1生成,因此上面第一個缺陷通常不存在,你需要注意的是某些應用是否會自己生成非順序的UUID插入表中。

下面通過示例來看差別,我們創(chuàng)建兩張結構一樣的表,一張用數(shù)字作為主鍵,一張用UUID作為主鍵:

create table digital_pk(
id int auto_increment primary key,
serial int);

create table uuid_pk(
id varchar(36) default(uuid()) primary key,
serial int);

我們分別向2張表中插入5條數(shù)據(jù):

insert into digital_pk(serial) values(1);
insert into digital_pk(serial) values(2);
insert into digital_pk(serial) values(3);
insert into digital_pk(serial) values(4);
insert into digital_pk(serial) values(5);

insert into uuid_pk(serial) values(1);
insert into uuid_pk(serial) values(2);
insert into uuid_pk(serial) values(3);
insert into uuid_pk(serial) values(4);
insert into uuid_pk(serial) values(5);

我們通過explain來查看索引的信息:

  • explain select * from digital_pk where id=1\G

explain select * from uuid_pk where id='71b49d70-7f98-11ee-a9a1-0050569c9844'\G

可以看到uuid作為主鍵的長度是146,而數(shù)字做主鍵的長度為4,這意味著當數(shù)據(jù)量非常大的時候,UUID的索引會非常臃腫,查詢性能會很低。

二、優(yōu)化方案

雖然通常不推薦使用UUID作為表的主鍵,但某些場景如果我們必須要用UUID作為主鍵,我們也可以通過一些方法來規(guī)避上述缺陷。

MySQL為了優(yōu)化UUID的存儲,專門提供了兩個函數(shù):

  • uuid_to_bin(uuid, swap_flag),將字符型UUID轉(zhuǎn)換為二進制UUID,轉(zhuǎn)換后返回的數(shù)據(jù)類型是varbinary。
  • bin_to_uuid(uuid, swap_flag),將二進制UUID轉(zhuǎn)換為字符型UUID

在存儲的時候用uuid_to_bin(uuid, swap_flag)將UUID由字符型轉(zhuǎn)化為二進制,可以大大縮小索引的長度,函數(shù)中的swap_flag有2個取值:

  • 0 代表轉(zhuǎn)換后的數(shù)據(jù)依然是和UUID字符排序相同
  • 1 代表轉(zhuǎn)換后將UUID中的time-low和time-high部分(第一和第三組)交換位置,轉(zhuǎn)換后數(shù)據(jù)可以按時間連續(xù)遞增,對InnoDB的聚簇索引還會有性能提升。注意這個僅對UUID V1版本基于時間戳生成的UUID才有效,如果是其他類型的UUID,不會得到性能提升。

下面我們利用這個函數(shù)新建一個表uuid_pk_v2:

create table uuid_pk_v2(
id binary(16) default(uuid_to_bin(uuid(),1)) primary key,
serial int);

  • 這里id列的數(shù)據(jù)類型變成了binary(16),同時uuid在存儲時轉(zhuǎn)換為二進制型存儲。

插入1條數(shù)據(jù)

  • insert into uuid_pk_v2(serial) values(1);

select id, serial from uuid_pk_v2;
select bin_to_uuid(id,1), serial from uuid_pk_v2;

  • 直接查詢是以16進制顯示的數(shù)據(jù),這對我們沒有意義,我們需要用bin_to_uuid()函數(shù)將數(shù)據(jù)還原為字符串型UUID。

我們再看一下索引:

explain select * from uuid_pk_v2 where id=uuid_to_bin('a292725f-7fa1-11ee-a9a1-0050569c9844',1)\G

  • 索引的長度從164縮短為16,只有原來的十分之一,這代表索引在磁盤和內(nèi)存占用的空間也會縮小至十分之一,掃描速度會快的多。
  • 因此,雖然在插入和查詢的時候多了一層函數(shù)的處理,但是這可以完美解決前面UUID的兩個缺陷,帶來的性能提升是完全值得的。

到此這篇關于MySQL中UUID主鍵的優(yōu)化小結的文章就介紹到這了,更多相關MySQL UUID主鍵優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 淺析MySQL 備份與恢復

    淺析MySQL 備份與恢復

    這篇文章主要介紹了MySQL 備份與恢復的相關資料,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下
    2020-08-08
  • 盡量避免使用索引合并的場景問題解析

    盡量避免使用索引合并的場景問題解析

    這篇文章主要為大家介紹了盡量避免使用索引合并的場景問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Mysql的timeout以及python重連方式

    Mysql的timeout以及python重連方式

    這篇文章主要介紹了Mysql的timeout以及python重連方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • MySQL存儲IP地址的三種方法

    MySQL存儲IP地址的三種方法

    在MySQL中,存儲IP地址通常有幾種推薦的方法,每種方法都有其優(yōu)缺點,可以根據(jù)具體需求選擇合適的方式,本文給大家介紹了MySQL存儲IP地址的三種方法:使用VARCHAR類型,使用INT類型存儲IPv4和使用BINARY(16)或VARBINARY(16)存儲IPv6,需要的朋友可以參考下
    2024-07-07
  • Mysql數(shù)據(jù)庫之Binlog日志使用總結(必看篇)

    Mysql數(shù)據(jù)庫之Binlog日志使用總結(必看篇)

    下面小編就為大家?guī)硪黄狹ysql數(shù)據(jù)庫之Binlog日志使用總結(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • MySQL中的存儲過程和觸發(fā)器詳解

    MySQL中的存儲過程和觸發(fā)器詳解

    本文系統(tǒng)介紹了MySQL存儲過程的創(chuàng)建與使用,包括變量定義、條件判斷、循環(huán)控制、游標操作等核心知識,詳細講解了存儲過程的優(yōu)缺點分析,以及存儲函數(shù)與觸發(fā)器的區(qū)別與應用場景,通過具體示例演示了如何實現(xiàn)參數(shù)傳遞、條件處理、日志記錄等功能
    2025-09-09
  • mysql count(*)分組之后IFNULL無效問題

    mysql count(*)分組之后IFNULL無效問題

    文章總結:作者分享了在解決MySQL中根據(jù)發(fā)票ID和單位統(tǒng)計單位數(shù)量的問題時遇到的困難及解決方法,通過使用IFNULL()函數(shù)和CASEWHEN都無法解決問題,最終作者選擇了嵌套循環(huán)的方法來實現(xiàn)需求,并總結了經(jīng)驗以供參考
    2024-11-11
  • Linux下mysql 5.6.17安裝圖文教程詳細版

    Linux下mysql 5.6.17安裝圖文教程詳細版

    這篇文章主要為大家詳細介紹了Linux下mysql 5.6.17安裝圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 如何實現(xiàn)MySQL的索引

    如何實現(xiàn)MySQL的索引

    這篇文章主要介紹了如何實現(xiàn)MySQL的索引,MySQL中索引分三類,有B+樹索引、Hash索引和全文索引,下面我們一起來看看MySQL索引的具體實現(xiàn),需要的小伙伴可以參考一下
    2022-01-01
  • Mysql實戰(zhàn)練習之簡單圖書管理系統(tǒng)

    Mysql實戰(zhàn)練習之簡單圖書管理系統(tǒng)

    由于課設需要做這個,于是就抽了點閑余時間,寫了下,用Mysql與Java,基本全部都涉及到,包括借書/還書,以及書籍信息的更新,查看所有的書籍。需要的朋友可以參考下
    2021-09-09

最新評論

通州区| 聂荣县| 海宁市| 象州县| 临高县| 岑巩县| 璧山县| 大埔县| 炎陵县| 陆河县| 楚雄市| 确山县| 云安县| 睢宁县| 喀什市| 渝北区| 辉县市| 大宁县| 新巴尔虎左旗| 上犹县| 崇文区| 华阴市| 明光市| 鹤岗市| 呈贡县| 罗定市| 砚山县| 平谷区| 开鲁县| 康平县| 高淳县| 腾冲县| 乌兰县| 友谊县| 固镇县| 浠水县| 绥德县| 雷波县| 双柏县| 仙游县| 和平县|