如果用UUIDmysql用什么做主键键,那么如何排序哦

博客分类:
那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的算法中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性.
优点:
能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
缺点:
比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。
使用UUID后,URL显得冗长,不够友好。
那么到底使用不使用UUID做主键呢?? http://hi.baidu.com/thinkinginlamp/blog/item/c609dd0581b60.html
那么如何生成UUID,一个自动生成不重复文本的函数,Hibernate提供的uuid.
hibernate中的uuid是自动生成主键的一种机制,但是它依赖于hiberbate包,刚刚将它从Hibernate中提取出来,(从其他博客和公司的组件代码中发现了UUID的生成类)供各位使用.
import java.net.InetA
* @author zhangguang
public class UUIDHexGenerator {
private static final int IP;
private static UUIDHexGenerator instance =
private static short counter = (short) 0;
private static final int JVM = (int) ( System.currentTimeMillis() &&& 8 );
private String sep = "";
ipadd = toInt( InetAddress.getLocalHost().getAddress() );
catch (Exception e) {
ipadd = 0;
protected String format(int intval) {
String formatted = Integer.toHexString(intval);
StringBuffer buf = new StringBuffer("");
buf.replace( 8-formatted.length(), 8, formatted );
return buf.toString();
protected String format(short shortval) {
String formatted = Integer.toHexString(shortval);
StringBuffer buf = new StringBuffer("0000");
buf.replace( 4-formatted.length(), 4, formatted );
return buf.toString();
public static int toInt( byte[] bytes ) {
int result = 0;
for (int i=0; i&4; i++) {
result = ( result && 8 ) - Byte.MIN_VALUE + (int) bytes[i];
protected int getJVM() {
return JVM;
protected short getCount() {
synchronized(UUIDHexGenerator.class) {
if (counter&0) counter=0;
return counter++;
* @author zhangguang
* @return UUID. 一組 UUID,係由一串 16 位元組(亦稱 16 字節,或 128 位元)的16進位數字所構成
public String generate() {
return new StringBuffer(36)
.append( format( getIP() ) ).append(sep)
.append( format( getJVM() ) ).append(sep)
.append( format( getHiTime() ) ).append(sep)
.append( format( getLoTime() ) ).append(sep)
.append( format( getCount() ) )
.toString();
protected int getIP() {
return IP;
protected short getHiTime() {
return (short) ( System.currentTimeMillis() &&& 32 );
protected int getLoTime() {
return (int) System.currentTimeMillis();
public static UUIDHexGenerator getInstance()
if (instance == null)
instance = new UUIDHexGenerator();
public static void main( String[] args ) throws Exception {
for ( int i=0; i&10; i++) {
String id = getInstance().generate();
System.out.println(id);
String id2 = getInstance().generate();
System.out.println(id2);
浏览: 23972 次
来自: 石家庄
java.util.UUID.randomUUID().toS ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'never wrong to do the right thing
UUID做主键,好还是不好?这是个问题。
以前对UUID的了解很少,只知道是128位整数(16字节)的全局唯一标识符(Universally
Unique Identifier)。刚才google了下,算是有了点深入的了解。
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals
Unique Identifiers)。
使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显。
我唯一还算熟悉的就算是了,大概使用MySQL的人,百分之九九以上的人会使用Autoincrement
ID做主键,这是可以理解的,因为MySQL的自增ID效率很高,使用也很方便。那么剩下的百分之一的人使用什么做主键呢?可能是自己做的KeyGenerator,也可能是我们下面要说的UUID。
据说在的圈子里,如果谁用自增ID做主键是要被鄙视的,主键最自然的选择就是UUID。我不了解Oracle,这些道听途说的结论是否正确不做承诺。
那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性。
如果你的MySQL版本不太老的话,键入 SELECT UUID(); 输出的就是UUID,如下:
mysql& select uuid();
+--------------------------------------+
| uuid() |
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+
现在大家应该对UUID有一个比较直观的认识了,我们来看看UUID的优缺点分别是什么。优点:
能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。缺点:
比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。
使用UUID后,URL显得冗长,不够友好。
下面针对上述UUID的缺点说说我的看法,比较占地方这个缺点我不是很在乎,现在最不值钱的就是硬盘了,略过此条缺点无妨,但需要注意的一点数据在索引的时候效率会随着体积的增加而降低。至于说使用UUID后,URL显得不友好,我觉得这多少是你的INT情结造成的惯性思维,其实,和INT类型相比,UUID才是最自然的主键选择,注意,我这里用的是自然这个形容词,仔细体会一下你能理解我的意思。另外,很多时候,URL本身就不需要友好,比如,一个电子商务网站,按照INT友好的URL说法,她的订单URL大概是下面这个形式的:/order./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。
我本来想在我自己的电脑上插入1000000条数据测试一下看看来着,可惜一测试,硬盘灯就一直亮,让我很担心它会挂,虽然硬盘不值钱,但是我重要的数据都在上面,一旦坏了,损失就大了,所以,测试只好作罢。
至于在MySQL上使用UUID(用char(36)存储,也可以用binary(16)存储)做主键,效率到底如何,我也不知道,抱歉 -_-!!!
public static String get32UUID(){
String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!拒绝访问 | www.colabug.com | 百度云加速
请打开cookies.
此网站 (www.colabug.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(430088eebac24370-ua98).
重新安装浏览器,或使用别的浏览器请问如果用UUID做主键,那么如何排序哦
[问题点数:0分,结帖人wangdj20010]
本版专家分:0
结帖率 97.06%
CSDN今日推荐
本版专家分:105
本版专家分:255
本版专家分:957
本版专家分:8481
结帖率 93.1%
匿名用户不能发表回复!|
CSDN今日推荐UUID做主键,好还是不好?这是个问题
UUID做主键,好还是不好?这是个问题
作者:老王
我唯一还算熟悉的数据库就算是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();
+--------------------------------------+
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+
现在大家应该对UUID有一个比较直观的认识了,我们来看看UUID的优缺点分别是什么。优点:
能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。缺点:
比较占地方,和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本身的算法实现也有很大关系。
我本来想在我自己的电脑上插入1000000条数据测试一下看看来着,可惜一测试,硬盘灯就一直亮,让我很担心它会挂,虽然硬盘不值钱,但是我重要的数据都在上面,一旦坏了,损失就大了,所以,测试只好作罢。
至于在MySQL上使用UUID(用char(36)存储)做主键,效率到底如何,我也不知道,抱歉 -_-!!!
转载:http://mlxia.iteye.com/blog/279059
感谢博主分享
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 使用uuid做主键 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信