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(); +--------------------------------------+ | 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本身的算法实现也有很大关系。 另外,对于InnoDB这种聚集主键类型的引擎来说,数据会按照主键进行排序,由于UUID的无序性,InnoDB会产生巨大的IO压力,此时不适合使用UUID做物理主键,可以把它作为逻辑主键,物理主键依然使用自增ID。 我本来想在我自己的电脑上插入1000000条数据测试一下看看来着,可惜一测试,硬盘灯就一直亮,让我很担心它会挂,虽然硬盘不值钱,但是我重要的数据都在上面,一旦坏了,损失就大了,所以,测试只好作罢。 至于在MySQL上使用UUID(用char(36)存储,也可以用binary(16)存储)做主键,效率到底如何,我也不知道,抱歉 -_-!!! 转自:http://hi.baidu.com/thinkinginlamp/blog/item/c609d10979710e81d0581b60.html
分享到:
相关推荐
这个测试案例将创建一个新的`DemoEntity`实例并保存到数据库,然后检查是否成功生成并保存了UUID主键。 ### 7. 总结 通过以上步骤,你已经学会了如何在Hibernate中使用UUID作为主键。这种方式不仅提供了全局唯一性...
总结来说,Spring Boot整合MyBatis和MySQL实现主键UUID的方法主要包括:配置项目依赖,设置数据库连接信息,自定义MyBatis配置,创建使用UUID主键的实体类,以及编写相应的Mapper接口。这种方法在分布式系统中特别...
然后,你可以创建一个Session,调用`save()`或`saveOrUpdate()`方法来保存包含UUID主键的新实体。Hibernate会自动处理主键的生成和插入。 值得注意的是,虽然UUID在大多数情况下能保证全局唯一性,但其长度较长(36...
MySQL 雪花算法生成唯一整型ID主键的实现主要针对大数据环境下,需要大量生成全局唯一ID的需求。雪花算法是一种分布式ID生成策略,由Twitter开源,其设计目标是在分布式系统中生成具有全局唯一性、有序性和高并发性...
Mycat 支持多种主键生成策略,包括:UNIONID(联合ID)、SEQUENCE(序列号)、TABLE(表序列)、UUID 和 AUTO_INCREMENT(自增)。其中,AUTO_INCREMENT 策略是与 MySQL 自增主键类似的方式,适用于单表插入操作。...
面试官:”用过mysql吧,你们是用自增主键还是UUID?” 你:”用的是自增主键” 面试官:”为什么是自增主键?” 你:”因为采用自增主键,数据在物理结构上是顺序存储,性能最好,blabla…” 面试官:”那自增主键...
uuid是一种基于128位的uuid算法生成主键的策略。这种策略生成的主键是一个32位的16进制数字的字符串。这种策略占用空间较大,因为主键是一个字符串类型的字段。uuid策略适用于需要高唯一性的场景,但它占用空间较大...
在PHP中,生成UUID常常用于创建唯一的记录标识,比如数据库中的主键或者分布式系统中的唯一标识。本文将深入探讨如何使用PHP来实现UUID的生成。 一、开发环境 在Windows 8操作系统上,我们需要搭建一套LAMP(Linux...
3. 数据库迁移:在创建表的迁移文件中,设置主键为UUID类型,如在MySQL中使用`binary(16)`或`char(36)`,在PostgreSQL中使用`uuid`。 ```php public function up() { Schema::create('my_models', function ...
例如,在MySQL中,你需要创建一个`binary(16)`类型的字段,而在PostgreSQL中,可以使用`uuid`类型。Laravel的迁移文件可以帮助你完成这些操作。 总之,Laravel-uuid扩展包为Laravel开发者提供了一种简单且可靠的...
3. 数据库兼容性:支持多种数据库系统,如MySQL、PostgreSQL等,它们可能对UUID字段有不同的处理方式。 4. Eloquent集成:与Laravel的Eloquent ORM(对象关系映射)紧密集成,使得在查询、更新和删除模型时能够无缝...
UUID是全局唯一的,可以在分布式环境中安全使用,但主键长度较长,可能会影响数据库的存储效率。 每种主键生成策略都有其适用场景和优缺点,开发者应根据项目需求和所使用的数据库类型来选择最合适的策略。在实际...
我们创建了一个专门insert数据的函数,使用uuid作为主键,并与intime一起作为主键。 分区创建 在创建分区时,需要注意字段intime必须是主键或主键的一个。我们可以将原来单个id主键索引删掉,改成id、intime为主键...
在SQL Server和MySQL这两种常见的数据库管理系统中,主键的生成方式主要有三种:数据库自动生成、GUID(全局唯一标识符)以及开发创建。下面将详细讨论这三种方式。 **一、数据库自动生成** 在SQL Server中,这种...
8. **`uuid`**:生成128位的UUID字符串作为主键。 9. **`foreign`**:主键值来源于另一个实体的主键,常用于一对一关系。 10. **`counter`**:在内存中维护一个计数器,适用于单线程环境。 11. **`optimistic-...
1. 自动递增:在许多数据库系统中,如MySQL的`AUTO_INCREMENT`和SQL Server的`IDENTITY`,可以设置一个整数字段自动递增作为主键。这种方式简单且易于管理,但当需要分布式或并行插入时可能会遇到问题。 2. 时间戳...
而Hibernate提供了跨数据库的主键生成策略,例如`native`策略,它会根据底层数据库自动选择合适的主键生成方式(如MySQL的自动增长ID或Oracle的序列)。 在JPA中,通过`@GenericGenerator`注解可以定义主键的生成...
在MySQL数据库中,主键是表的一个重要组成部分,它用于唯一标识每条记录,并且通常设置为自动增长的整数类型,如INT。然而,在某些业务场景中,可能需要将已有的自增长主键INT类型改为CHAR类型。这通常发生在需要更...