- 浏览: 1546982 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (532)
- 软件设计师 (7)
- PSP (5)
- NET MD (9)
- Hibernate (8)
- DIY (51)
- Work (43)
- GAME (24)
- 未分类 (44)
- iPod (6)
- MySQL (39)
- JSP (7)
- 日语能力考试 (36)
- 小说 (4)
- 豆包网 (23)
- 家用电脑 (7)
- DB2 (36)
- C/C++ (18)
- baby (9)
- Linux (13)
- thinkpad (23)
- OA (1)
- UML (6)
- oracle (24)
- 系统集成 (27)
- 脑梗塞 (6)
- 车 (8)
- MainFrame (8)
- Windows 7 (13)
- 手机 (8)
- git (12)
- AHK (2)
- COBOL (2)
- Java (9)
最新评论
-
安静听歌:
... ...
UUID做主键,好还是不好?这是个问题。 -
lehehe:
http://www.haoservice.com/docs/ ...
天气预报 -
lehehe:
[url http://www.haoservice.com/ ...
天气预报 -
liubang201010:
监控TUXEDO 的软件推荐用这个,专业,权威.并能提供报警和 ...
(转载)Tuxedo中间件简介 -
tinkame:
Next[j] =-1 当j=0时;=Max{k|0<k ...
KMP字符串模式匹配详解
查看文章
|
UUID做主键,好还是不好?这是个问题。
2007年11月05日 星期一 下午 07:00
作者:老王
我唯一还算熟悉的数据库就算是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 | +--------------------------------------+ 现在大家应该对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)存储)做主键,效率到底如何,我也不知道,抱歉 -_-!!! 参考链接 (一)(二)(三)(四)(五) |
网友评论:
1 |
网友:Jake
|
2007年11月05日 星期一 下午 08:52
uuid是字符串,不能用$id = intval($id)保证传回的是整数了。
|
2 |
网友:Jake
|
2007年11月05日 星期一 下午 08:53
会不会有SQL注入的危险。
|
3 |
网友:老王
|
2007年11月06日 星期二 上午 11:40
to Jake: -_-!!!
|
4 |
网友:trooman
|
2007年11月06日 星期二 下午 01:55
uuid看起来的确是字符串型,怎么也没法想象它比整型的效率高!!做HASH时,大都选择整型,很多情况都说明用整型的效率比字符串类型高效啊!如果是订单,为了防止商业秘密泄漏,再加个订单编号不就行了?
可能怪我认识浅陋! |
5 |
网友:dualface
|
2007年11月06日 星期二 下午 04:12
用整型不代表就得顺序增加啊。比如订单号,完全可以按照日期或者其他规则来生成。反正int肯定足够存储的。
|
6 |
网友:dualface
|
2007年11月06日 星期二 下午 04:19
而且如果是垂直分割数据表的数据,将其分散到多个服务器存储。貌似int还更方便。比如有4台服务器,就可以用 $db_index = $id % 4 算出该记录放在哪个服务器。
|
8 |
网友:Jake
|
2007年11月08日 星期四 上午 05:13
to 老王 : P
Just a little reminder. |
9 | 2007年11月23日 星期五 下午 12:55
担心的uuid确实就是效率问题
需要大规模查询场合uuid没法和int比 |
10 | 2007年11月29日 星期四 上午 09:09
学习了
|
11 | 2007年11月29日 星期四 下午 03:37
http://hi.baidu.com/dandankai/blog/item/313eaf0a7dbd7a3db0351d4c.html
http://www.zhenhua.org/article.asp?id=200 |
12 | 2007年12月19日 星期三 下午 12:52
http://dev.mysql.com/tech-resources/articles/
|
发表评论
-
MySQL配置文件my.cnf 例子最详细翻译
2009-07-20 11:58 1755http://www.blogjava.net/hunte ... -
MySQL :: @@Rowcount in MySQL
2009-03-02 15:39 2255@@Rowcount in MySQL? Posted ... -
MYSQL中删除重复记录的方法
2009-02-26 12:23 0MYSQL中删除重复记录的方法 2008 ... -
使用 MYSQLBINLOG 来恢复数据。
2009-02-26 12:21 0使用 MYSQLBINLOG 来恢复数据。 20 ... -
13.2.3. InnoDB Startup Options and System Variable
2009-02-20 13:37 1270http://dev.my ... -
mysql innodb 配置详解
2009-02-20 11:01 3591加为好友发送私信在线聊天 -
20.3.9 关于死锁 深入浅出MySQL——数据库开发、优化与管理维护
2009-02-20 10:50 3165深入浅出MySQL——数据库开发、优化与管理维护 回 ... -
mysql的临时表不支持自连接
2009-02-18 13:32 2371TEMPORARY TABLE ProblemsThe fol ... -
windows 下安装两个MySQL收藏
2009-02-03 16:28 2400由于两个MySQL进程需要不同的配置文件,以下所有操作均是在W ... -
1.4.1. What's New in MySQL 5.1
2009-02-03 16:25 11861.4.1. What's New in My ... -
查看mysql版本的四种方法
2009-02-02 10:57 9751:在终端下:mysql -V。 以下 ... -
Server SQL Modes
2009-02-01 11:06 14385.1.7. Server SQL Modes ... -
MySQL中的各种JOIN(CROSS JOIN, INNER JOIN, LEFT [OUTER]
2009-01-13 14:50 6228MySQL中的各种JOIN(CROSS JOIN, I ... -
[转]SQL Server 2000执行计划成本(5/5)
2009-01-09 15:26 1206[转]SQL Server 2000执行计划成本(5/5) ... -
SQL Server 2000执行计划成本(4/5)
2009-01-09 15:25 1108[转]SQL Server 2000执行计划成本(4/5) ... -
[转]SQL Server 2000执行计划成本(3/5)
2009-01-09 15:23 1539[转]SQL Server 2000执行计划成本(3/5) ... -
SQL Server 2000执行计划成本(1/5)
2009-01-09 14:52 1650[转]SQL Server 2000执行计划成本(1/5) ... -
浅谈MySQL数据库优化
2009-01-09 14:46 1350浅谈MySQL数据库优化 [收藏此页] [打印] ... -
sql server支持create table as ...建表么
2009-01-09 11:52 9049sql server支持create table as .. ... -
SQL Server如何识别自动创建的索引
2009-01-08 15:57 1321SQL Server如何识别自动创建的索引 http://w ...
相关推荐
这个测试案例将创建一个新的`DemoEntity`实例并保存到数据库,然后检查是否成功生成并保存了UUID主键。 ### 7. 总结 通过以上步骤,你已经学会了如何在Hibernate中使用UUID作为主键。这种方式不仅提供了全局唯一性...
"自动生成主键uuid.zip"这个压缩包文件很可能是包含了一个Java程序示例,用于演示如何生成这样的32位ID。 在Java中,生成UUID主要通过`java.util.UUID`类提供的静态方法。`UUID.randomUUID()`是生成一个随机的UUID...
公司实际项目中采用UUID算法生成主键的工具类,有需要的朋友们可以拿去
这个方法使用正则表达式来匹配 UUID 的格式,如果匹配成功,则返回 true,否则返回 false。 在实际应用中,我们可以使用 UUID 来生成唯一的 ID,例如在数据库中生成一个唯一的主键。同时,我们也可以使用 UUID 来...
为了解决这个问题,我们需要了解 Activiti5 的默认主键策略和解决方案。 Activiti5 的默认主键策略是全局获取一个通用表中的字段来做增加,每次需要主键的时候从 act_ge_property 表中的 next.dbid 中获取下一个主...
1.1:要说明这个问题,我们首先来建立三张表,分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变.根据控制变量法,我们只把每个表的主键使用...
这个类提供了多种生成UUID的方法,如`randomUUID()`,`nameUUIDFromBytes()`,`timestamp()`等。其中,`randomUUID()`是最常用的,它基于当前时间戳和随机数生成一个UUID,通常形式为“-”分隔的32个十六进制数字。...
总结来说,Spring Boot整合MyBatis和MySQL实现主键UUID的方法主要包括:配置项目依赖,设置数据库连接信息,自定义MyBatis配置,创建使用UUID主键的实体类,以及编写相应的Mapper接口。这种方法在分布式系统中特别...
为了解决这个问题,开发者创建了专门的JS库来生成UUID。 这个压缩包文件"JavaScript的UUid"很可能包含了一个或多个JavaScript库,这些库专注于生成符合UUID规范的唯一字符串。常见的JavaScript UUID库有`uuid-js`、...
UUID是一个128位的数字,通常表示为32个十六进制数字,用于唯一标识网络中的对象。它在分布式系统、数据库、软件开发等领域广泛使用,确保了在全球范围内不会重复。 PB,即Protocol Buffers,是Google推出的一种...
Mycat 支持多种主键生成策略,包括:UNIONID(联合ID)、SEQUENCE(序列号)、TABLE(表序列)、UUID 和 AUTO_INCREMENT(自增)。其中,AUTO_INCREMENT 策略是与 MySQL 自增主键类似的方式,适用于单表插入操作。...
在“uuid.zip_uuid”这个压缩包中,包含了两个文件:uuid.cpp和uuid.h,这通常意味着它们是C++编程语言中的源代码文件和头文件。cpp文件一般包含实现函数和类的方法,而h文件则定义了接口和类的结构。这里,uuid.cpp...
标题中的“这个包可以让您轻松地在Laravel模型中使用UUID”表明我们正在讨论一个针对Laravel框架的扩展包,它的主要功能是帮助开发者在Laravel应用中的模型中集成和管理UUID(通用唯一标识符)作为主键。Laravel是一...
这就是`eloquent-uuid`这个扩展包的作用,它为Laravel4的Eloquent模型添加了对UUID(通用唯一标识符)的支持。 在传统的自增ID中,新插入的记录ID会连续增长,这可能会暴露系统的一些信息,如数据量或新用户注册...
`fast-uuid`就是这样一个针对UUID操作的工具类库,它可以被用于生成、解析和比较UUID,而这些操作通常在数据库主键生成、分布式系统节点标识、数据交换等场景中广泛应用。 该库的性能提升主要体现在以下几点: 1. ...
`laravel-trait-uuid`是专门为Laravel设计的一个特性(Trait),用于方便地在Eloquent模型中实现UUID作为主键的功能。 本文将详细讲解如何使用`laravel-trait-uuid`来在Laravel项目中集成UUID,并探讨其背后的工作...
GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复
在使用这个策略时,JPA会将主键的生成工作交由数据库完成,hibernate 不会介入。这意味着,数据库将负责生成主键,而不是hibernate。这种策略适用于大多数情况,因为它可以确保主键的唯一性和连续性。 uuid uuid是...
这段代码中,`create_uuid()`函数首先通过`md5(uniqid(mt_rand(), true))`生成一个基于当前时间戳和随机数的128位字符串,然后根据UUID的格式(32位分为5段,每段之间用'-'分隔)进行切割并拼接。最后,如果提供了...