`

数据库主键到底是用自增长(INT)好还是UUID好

 
阅读更多

之前在参加长沙互联网大会的时候问过微信DBA一个问题,数据库主键到底是用自增长好还是UUID好?DBA回答:自增长好,因为自增长有占用空间小、索引快等特点。但这一定是最好的吗?最近在做一个项目刚好也遇到了同样纠结的问题,其实这个问题我已经查过很多资料也问过很多人了,最后总结归纳下,仅供大家参考。

其实针对使用自增长还是UUID,大家讨论最多的就是速度和存储空间,这里我加入了安全性和分布式,具体对比如下:

    使用自增长做主键的优点:
    1、很小的数据存储空间
    2、性能最好
    3、容易记忆
    使用自增长做主键的缺点:
    1、如果存在大量的数据,可能会超出自增长的取值范围
    2、很难(并不是不能)处理分布式存储的数据表,尤其是需要合并表的情况下
    3、安全性低,因为是有规律的,容易被非法获取数据
    使用GUID做主键的优点:
    1、它是独一无二的,出现重复的机会少
    2、适合大量数据中的插入和更新操作,尤其是在高并发和分布式环境下
    3、跨服务器数据合并非常方便
    4、安全性较高
    使用GUID做主键的缺点:
    1、存储空间大(16 byte),因此它将会占用更多的磁盘空间
    2、会降低性能
    3、很难记忆

结合每个项目的实际应用,我们应该怎么选择呢?如下:

    1、项目是单机版的,并且数据量比较大(百万级)时,用自增长的,此时最好能考虑下安全性,做些安全措施。
    2、项目是单机版的,并且数据量没那么大,对速度和存储要求不高时,用UUID。
    3、项目是分布式的,那么首选UUID,分布式一般对速度和存储要求不高。
    4、项目是分布式的,并且数据量达到千万级别可更高时,对速度和存储有要求时,可以用自增长。

现在有人就会问了,为什么不直接用第4种方案,它满足前面三种方案的所有要求?就是因为在用自增长时分布式处理会很复杂(具体方案可以百度),在资源有限的情况可以采用前面三种简单的实现方案。

那么,为什么一定要使用自增长或UUID作为数据库主键呢?有没有更好的解决方案呢?肯定有:snowflake

其实大部分项目可以使用twitter的snowflake来生成主键,snowflake生成的主键就是介于自增长和UUID之间的一种主键(存储空间小、速度快、分布式、时间序列)。据说snowflake每秒能够产生26万个ID,最多可以部署在1024个节点上,研发团队可以将snowflake作为底层的数据库主键工具类供团队成员使用。



分享到:
评论

相关推荐

    mysql修改自增长主键int类型为char类型示例

    然而,在某些业务场景中,可能需要将已有的自增长主键INT类型改为CHAR类型。这通常发生在需要更灵活的主键策略或者需要存储特定格式的数据(如UUID)时。以下是一个逐步的示例,说明如何在不丢失现有数据的情况下...

    Hibernate主键生成

    1. **increment**:此策略对long、short或int类型的字段生成自动增长的主键。主键值按数值顺序递增。但这种方法存在并发问题,如果多实例访问同一数据库,可能导致主键重复。 2. **identity**:适用于SQL Server、...

    Oracle与Mysql自动增长列(id)的区别

    Oracle 和 MySQL 在处理自动增长列(通常用于主键ID)方面有着显著的差异。自动增长列主要用于确保每个新插入的行都有一个唯一的标识符。在MySQL中,这个过程相对直接,而在Oracle中则需要借助序列(sequence)来实现...

    mysql把主键定义为自动增长标识符类型

    而将主键定义为自动增长标识符类型(通常使用`INT`并配合`AUTO_INCREMENT`属性)是一种常见的实践,尤其在需要连续、唯一的序列号时。这种设计模式在关系型数据库中广泛使用,可以避免人为地为每条新记录分配一个...

    hibernate主键生成策略

    - **实现原理**:利用数据库自身的自增特性来实现主键的自动增长。 - **应用场景**:适用于数据量较大或并发操作频繁的情况。 #### 3. `sequence` - **描述**:`sequence`策略同样依赖于数据库特性,通过序列...

    08_传智播客ibatis教程_sql主键生成方式

    2. **身份列(Identity)**:在MySQL、SQL Server等支持自动增长的数据库中,可以设置某一列为主键并自动递增。在Ibatis中,可以在插入语句后直接获取生成的主键值。 3. **雪花算法(Snowflake)**:这是一种分布式...

    MySQL自增长键理解

    更好的做法是,如果对自增序列的连续性有特定需求,应考虑使用其他设计策略,比如结合UUID或时间戳生成唯一的主键。 在处理自增主键时,需要注意删除记录不会影响后续自增值的计算,除非你显式地重置`AUTO_...

    mybatis-plus主键生成策略

    1. 数据库自增长序列:这是最常见的方式,由数据库自身保证唯一性和递增性,适用于单数据库环境。但缺点是不适用于分布式系统,且不同数据库的实现可能不同。 2. UUID:全局唯一,但无法保证顺序,占用空间较大,...

    JPA的Id注解.docx

    注意,对于自动增长的主键,通常推荐使用`long`或`Long`类型,因为它们可以处理较大的主键值。 总的来说,`@Id`和`@GeneratedValue`注解是JPA中进行主键管理的重要工具,它们帮助我们定义了如何创建和维护实体类与...

    java一级缓存及对象关系映射

    1. increment:由Hibernate管理,适用于整型主键且数据库支持自动增长,但可能导致主键冲突。 2. identity:由数据库生成,如MySQL和SQL Server支持,Oracle不支持。 3. sequence:依赖于数据库序列,如Oracle支持,...

    hibernate.hbm.xml详解

    - `identity`: 利用数据库的自动增长功能,如MySQL、DB2等。 - `sequence`: 利用数据库的Sequence,如Oracle。 - `native`: 根据数据库自动选择合适的策略。 - `uuid.hex`和`uuid.string`: 生成128位UUID的16...

    hibernate概述

    - **uuid**:生成128位的UUID字符串主键。 **Configuration类** `Configuration`类是Hibernate的核心组件,它负责管理和加载配置信息,包括数据库连接参数(URL、用户名、密码)、驱动类、映射文件等。配置完成后...

    mysql高频面试题及答案

    DROP KEY`语句删除普通索引、唯一索引和全文索引,删除主键索引时需先取消自增长属性。 10. **数据库的三大范式:** - 第一范式:确保每列都是不可分割的基本数据单元。 - 第二范式:非主键列完全依赖于主键,...

    java自动生成id策略

    在Java编程中,自动生成ID是一项常见的需求,特别是在数据库记录、分布式系统节点标识等领域。"java自动生成id策略"指的是设计并实现一种机制,确保在多线程环境下能够高效、唯一地生成ID。这里我们将详细探讨这个...

    hibernate注解

    - **@GeneratedValue**:定义主键生成策略,如.AUTO(数据库决定)、TABLE(使用特定表生成)、IDENTITY(自动增长列)和SEQUENCE(序列)。 - **@GenericGenerator**:允许定义自定义的Hibernate主键生成器,如...

    使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常)

    但是,这仅适用于数据库支持自增且数据类型为整数的情况,如 MySQL 的 `INT AUTO_INCREMENT`。 总之,避免 MyBatis-Plus 插入时的“id 值不存在异常”,关键在于正确地配置 `@TableId` 注解,以及确保插入的数据...

    hibernate说明文档

    - **identity**: 数据库驱动的自动增长策略,依赖于数据库的支持,同样适用于代理主键。 - **sequence**: 基于数据库序列的生成策略,适用于有序列支持的数据库。 - **hilo**: 使用high/low算法生成标识符,基于特定...

    Hibernate Tutorial 03 (Object Identifier).pdf

    此外,我们还了解了Hibernate提供的多种标识符生成策略,这些策略可以帮助我们在不同的场景下更好地管理和使用对象标识符。 通过学习本教程,您应该能够理解对象标识符的基本概念,并能够在实际项目中有效地运用...

Global site tag (gtag.js) - Google Analytics