`

数据库主键设置为全局唯一方案

阅读更多
现在通过数据的水平切分(sharding)来实现数据库 Scale Out 的解决方案受到了越来越多人的青睐,但是在切分过程中可能遇到的问题也肯定不在少数,如切分规则的设计,切分后的访问路由,切分后的主键的全局唯一等等。
这里我主要列举几个可以使用在 MySQL 数据库主键全局唯一方案及其优劣,供大家参考:

* 通过应用程序生成一个GUID,然后和数据一起插入切分后的集群。优点是维护简单,实现也容易。缺点是应用的计算成本较大,且GUID比较常,占用数据库存储空间较大,涉及到应用的开发。
说明:主要优势是简单,缺点是浪费存储空间,GUID:32字节,100W记录,多32兆,如果是int,4字节,会少28M。如果有外键关联,会浪费更多。

* 通过独立的应用程序事先在数据库中生成一系列唯一的 ID,各应用程序通过接口或者自己去读取再和数据一起插入到切分后的集群中。优点是全局唯一主键简单,维护相对容易。缺点是实现复杂,需要应用开发。
说明:ID表要频繁查和频繁更新,插入数据时,影响性能。

* 通过中心数据库服务器利用数据库自身的自增类型(如 MySQL的 auto_increment 字段),或者自增对象(如 Oracle 的 Sequence)等先生成一个唯一 ID 再和数据一起插入切分后的集群。优点是?好像没有特别明显的优点。缺点是实现较为复杂,且整体可用性维系在这个中心数据库服务器上,一旦这里crash 了,所有的集群都无法进行插入操作,涉及到应用开发。
说明:不推荐。

* 通过集群编号加集群内的自增(auto_increment类型)两个字段共同组成唯一主键。优点是实现简单,维护也比较简单,对应用透明。缺点是引用关联操作相对比较复杂,需要两个字段,主键占用空间较大,在使用 InnoDB 的时候这一点的副作用很明显。
说明:虽然是两个字段,但是这方式存储空间最小,仅仅多了一个smallint两个字节,100W也就多2M。

* 通过设置每个集群中自增 ID 起始点(auto_increment_offset),将各个集群的ID进行绝对的分段来实现全局唯一。当遇到某个集群数据增长过快后,通过命令调整下一个 ID 起始位置跳过可能存在的冲突。优点是实现简单,且比较容易根据 ID 大小直接判断出数据处在哪个集群,对应用透明。缺点是维护相对较复杂,需要高度关注各个集群 ID 增长状况。
说明:段满了,调整太麻烦。

* 通过设置每个集群中自增 ID 起始点(auto_increment_offset)以及 ID 自增步长(auto_increment_increment),让目前每个集群的起始点错开 1,步长选择大于将来基本不可能达到的切分集群数,达到将 ID 相对分段的效果来满足全局唯一的效果。优点是实现简单,后期维护简单,对应用透明。缺点是第一次设置相对较为复杂。
说明:避免重合需要多种方案结合
分享到:
评论

相关推荐

    数据库主键设计原则 设计数据库主健

    - GUID(全局唯一标识符)具有全球唯一性。 - 不依赖于任何中心服务器,适用于分布式系统。 2. **缺点**: - GUID占用空间较大(16字节),可能导致表膨胀,影响存储效率。 - 在大量数据情况下,GUID排序效率较...

    分布式数据库唯一主键设计

    ID生成系统通常是一个独立的服务,负责为分布式数据库生成全局唯一的主键。这些系统需要具备以下特性: 1. 高可用:即使在部分节点故障时,仍能保证ID的生成。 2. 高性能:能够快速生成和分发ID,以满足高并发写入...

    分步式主键发生器,适合分布式应用的id唯一性

    总的来说,这个分布式主键发生器项目利用Java语言和Ice通信框架,提供了一种解决方案,能够在大规模分布式系统中生成全局唯一的ID,确保数据的一致性和完整性。对于需要处理海量数据的分布式应用来说,这类工具是必...

    dedid全局唯一 ID(主键)生成器

    "dedid全局唯一 ID(主键)生成器" 是一个专为分布式数据库设计的系统,它的主要任务是生成全局唯一的标识符,通常作为数据表中的主键。这里的“dedid”可能是一个特定命名的ID生成器,它借鉴了Twitter的Snowflake...

    Hibernate主键生成方式

    UUID是全局唯一的,可以在分布式环境中安全使用,但主键长度较长,可能会影响数据库的存储效率。 每种主键生成策略都有其适用场景和优缺点,开发者应根据项目需求和所使用的数据库类型来选择最合适的策略。在实际...

    08_ibatis教程_sql主键生成方式.rar

    本教程“08_ibatis教程_sql主键生成方式”聚焦于Ibatis如何处理数据库主键的生成策略,这对于理解和优化数据库操作至关重要。 Ibatis允许开发者自定义SQL、存储过程以及高级映射,避免了几乎所有的JDBC代码和手动...

    全局唯一id生成器vesta.rar

    例如,在数据库中,主键通常需要是全局唯一的,Vesta可以提供这样的保证。在消息队列中,每条消息都需要一个唯一的ID,以便跟踪和处理。在微服务架构中,各个服务间的交互也需要唯一的消息ID,Vesta能够有效地满足这...

    activit5的主键问题

    Activiti5 的默认主键策略是全局获取一个通用表中的字段来做增加,每次需要主键的时候从 act_ge_property 表中的 next.dbid 中获取下一个主键值,但是主键增长步长是 100。这样,在高并发的情况下,可能会出现主键...

    全局自增ID设计方案

    1. **数据库表设计**:首先创建一个名为`Tickets64`的表,包含两个字段:`id`作为自增主键,`stub`为一个标记字段,默认值为`a`。 ```sql CREATE TABLE Tickets64 ( id BIGINT(20) UNSIGNED NOT NULL AUTO_...

    分布式唯一ID解决方案-雪花算法.docx

    ID生成器在应用程序中,经常需要全局唯一的ID作为数据库主键。如何生成全局唯一ID?首先,需要确定全局唯一ID是整型还是字符串?如果是字符串,那么现有的UUID就完全满足需求,不需要额外的工作。 SnowFlake算法...

    分布式架构系统生成全局唯一序列号的一些思路对比分析.docx

    总结来说,分布式架构系统生成全局唯一序列号的方法多种多样,包括但不限于Flickr方案的优化版、基于AtomicLong的号段管理和Snowflake算法等。选择哪种方案取决于具体业务需求、系统规模以及对性能、扩展性的要求。...

    关于数据库设计中主键问题的思考

    除此之外,还有其他类型的主键选择,如UniqueIdentifier(通常用于GUID/UUID),它能保证全局唯一性,但存储空间较大;联合式(复合式)主键是使用多个字段组合成的主键,适用于没有单一字段能唯一标识记录的情况,...

    Mycat全局序列号示例

    总结来说,Mycat的全局序列号功能通过两种方式——本地文件和数据库,提供了在分库分表场景下生成全局唯一主键的解决方案。本地文件方式简单易用,适用于对性能要求不高的场景,而数据库方式则在一致性上有更好的...

    Python的Flask框架与数据库连接的教程

    模型中的id字段通常作为主键,每个记录都有一个唯一的id值。此外,还可以设置其他字段,如nickname、email以及role,其中role字段可以用来区分不同的用户类型。 在实际的数据库操作中,ORM层会将这些类对象转化为...

    sharding-jdbc分布式数据库培训方案

    **分布式主键** 在分布式环境中至关重要,需要保证全局唯一性。Sharding-JDBC 提供了去中心化的主键生成方案,如使用 snowflake 算法,生成的主键基本有序,有利于数据库性能。 **主要流程** 包括 SQL 解析、SQL ...

    oracle数据库教程

    Oracle数据库是全球范围内广泛使用的大型关系数据库管理系统之一,它由甲骨文公司开发,并且提供了非常强大和全面的数据库解决方案。对于程序员和数据库管理员来说,掌握Oracle数据库的相关知识是非常重要的,而本...

    20、详细分析ShardingSphere新接入的CosID分布式主键生成框架-ev.rar

    在传统的单机数据库中,主键的生成相对简单,但在分布式环境中,如何保证各个节点生成的主键全局唯一且有序,就成为了一大挑战。CosID(Cosine Identifier)就是为了解决这一问题而诞生的,它借鉴了Snowflake算法的...

    hibernate 主键生成策略

    - **应用场景**:当需要跨数据库、跨系统的全局唯一性时使用。 #### 9. UUID.String - **描述**:与 UUID.Hex 类似,但生成的是一个 16 字节的字符串。 - **应用场景**:适用于需要较短字符串形式的 GUID 的场景。...

    网上商城项目_数据库设计说明书

    - **主键设计**:所有数据表均设置了唯一的主键,通常采用数据库系统自动生成的标识列。 - **外键设置**:为确保数据完整性,合理设置了必要的外键约束。例如,`ORDER`表中的`USER_ID`和`CREDITCARD_ID`字段作为...

Global site tag (gtag.js) - Google Analytics