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
總結
- 上一篇: IE兼容HTML5
- 下一篇: segue和delegate实现两个页面