日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UUID做主键

發布時間:2024/4/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UUID做主键 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

我唯一還算熟悉的數據庫就算是MySQL了,大概使用MySQL的人,百分之九九以上的人會使用Autoincrement ID做主鍵,這是可以理解的,因為MySQL的自增ID效率很高,使用也很方便。那么剩下的百分之一的人使用什么做主鍵呢?可能是自己做的KeyGenerator,也可能是我們下面要說的UUID。

據說在Oracle的圈子里,如果誰用自增ID做主鍵是要被鄙視的,主鍵最自然的選擇就是UUID。我不了解Oracle,這些道聽途說的結論是否正確不做承諾。

那么我們先看看什么是UUID?簡單的說,UUID是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。在UUID的算法中,可能會用到諸如網卡MAC地址,IP,主機名,進程ID等信息以保證其獨立性。

如果你的MySQL版本不太老的話,鍵入 SELECT UUID(); 輸出的就是UUID,如下:

mysql> select uuid();
+--------------------------------------+
| uuid()???????????????????????????????|
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+


oracle>?select sys_guid() from dual ;

現在大家應該對UUID有一個比較直觀的認識了,我們來看看UUID的優缺點分別是什么。

優點:

能夠保證獨立性,程序可以在不同的數據庫間遷移,效果不受影響。
保證生成的ID不僅是表獨立的,而且是庫獨立的,這點在你想切分數據庫的時候尤為重要。
在oracle做數據遷移的時候不會因為表的sequence不連續而出現問題


缺點:

比較占地方,和INT類型相比,存儲一個UUID要花費更多的空間。
使用UUID后,URL顯得冗長,不夠友好。

下面針對上述UUID的缺點說說我的看法,比較占地方這個缺點我不是很在乎,現在最不值錢的就是硬盤了,略過此條缺點無妨,但需要注意的一點數據在索引的時候效率會隨著體積的增加而降低。至于說使用UUID后,URL顯得不友好,我覺得這多少是你的INT情結造成的慣性思維,其實,和INT類型相比,UUID才是最自然的主鍵選擇,注意,我這里用的是自然這個形容詞,仔細體會一下你能理解我的意思。另外,很多時候,URL本身就不需要友好,比如,一個電子商務網站,按照INT友好的URL說法,她的訂單URL大概是下面這個形式的:/order.php/id/123,我要說明的是,這樣是很友好,但是有些太友好了,友好的甚至不安全,比如說,我早晨下一個訂單,發現URL是/order.php/id/1000,晚上再下一個訂單發現URL是/order.php/id/2000,那么我就可以估計出此網站一天的訂單數大致是1000左右,甚至能大體估計出它的銷售額,而這些數據往往都是重要的商業秘密。使用UUID就沒有這個顧慮。

效率?

如果上面說的UUID的所謂缺點都不成立的話,那么是否使用UUID做主鍵,唯一的問題就是效率了。據說在PostgreSQL等數據庫里,都有專門的UUID類型,在這樣的數據庫里,使用UUID做主鍵,效率沒有任何問題,可惜在MySQL里沒有這樣的字段,如果想在MySQL里保存UUID做主鍵,一般是使用CHAR(36)來模擬,因為不是一個原生的UUID類型,所以主鍵的效率到底如何有待測試,另外,UUID做主鍵的效率和UUID本身的算法實現也有很大關系。

另外,對于InnoDB這種聚集主鍵類型的引擎來說,數據會按照主鍵進行排序,由于UUID的無序性,InnoDB會產生巨大的IO壓力,此時不適合使用UUID做物理主鍵,可以把它作為邏輯主鍵,物理主鍵依然使用自增ID。

至于在MySQL上使用UUID(用char(36)存儲,也可以用binary(16)存儲)做主鍵,效率到底如何,我也不知道,抱歉 -_-!!!


java獲得uuid

import java.util.UUID;

public class IdGenerate {

?

public static String getUUIDString() {
???String id = UUID.randomUUID().toString();
???id = id.replace("-", "");
???return id;
}

public static void main(String[] args) {
???// TODO Auto-generated method stub
???System.out.println(IdGenerate.getUUIDString());
}

}


轉載于:https://my.oschina.net/guomingliang/blog/311628

總結

以上是生活随笔為你收集整理的UUID做主键的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。