在只使用单数据库时,使用自增主键ID无疑是最适合的。
但在集群、主从架构上时就会有一些问题,比如:主键的全局唯一
这里介绍一下在集群环境下除了自增ID外的其它创建主键的方案
1、通过应用程序生成一个GUID,然后和数据一起插入切分后的集群。优点是维护简单,实现也容易。缺点是应用的计算成本较大,且GUID的长度比较长,占用数据库存储空间较大,涉及到应用的开发。
说明:主要优势是简单,缺点是浪费存储空间。
2、通过独立的应用程序事先在数据库中生成一系列唯一的 ID,各应用程序通过接口或者自己去读取再和数据一起插入到切分后的集群中。优点是全局唯一主键简单,维护相对容易。缺点是实现复杂,需要应用开发。
说明:ID表要频繁查和频繁更新,插入数据时,影响性能。
3、通过中心数据库服务器利用数据库自身的自增类型(如 MySQL的 auto_increment 字段),或者自增对象(如 Oracle 的 Sequence)等先生成一个唯一 ID 再和数据一起插入切分后的集群。优点是?好像没有特别明显的优点。缺点是实现较为复杂,且整体可用性维系在这个中心数据库服务器上,一旦这里crash 了,所有的集群都无法进行插入操作,涉及到应用开发。
说明:不推荐。
4、通过集群编号加集群内的自增(auto_increment类型)两个字段共同组成唯一主键。优点是实现简单,维护也比较简单,对应用透明。缺点是引用关联操作相对比较复杂,需要两个字段,主键占用空间较大,在使用 InnoDB 的时候这一点的副作用很明显。
说明:虽然是两个字段,但是这方式存储空间最小,仅仅多了一个smallint两个字节。
5、通过设置每个集群中自增 ID 起始点(auto_increment_offset),将各个集群的ID进行绝对的分段来实现全局唯一。当遇到某个集群数据增长过快后,通过命令调整下一个 ID 起始位置跳过可能存在的冲突。优点是实现简单,且比较容易根据 ID 大小直接判断出数据处在哪个集群,对应用透明。缺点是维护相对较复杂,需要高度关注各个集群 ID 增长状况。
说明:段满了,调整太麻烦。
6、通过设置每个集群中自增 ID 起始点(auto_increment_offset)以及 ID 自增步长(auto_increment_increment),让目前每个集群的起始点错开 1,步长选择大于将来基本不可能达到的切分集群数,达到将 ID 相对分段的效果来满足全局唯一的效果。优点是实现简单,后期维护简单,对应用透明。缺点是第一次设置相对较为复杂。
说明:避免重合需要多种方案结合
分享到:
相关推荐
对于支持主键自增的数据库,如MySQL、SQLite、PostgreSQL等,系统会自动为每个新插入的记录生成一个唯一的主键值,无需手动设置。 在Java开发中,MyBatis作为一个轻量级的持久层框架,广泛应用于数据操作。MyBatis...
- **GenerationType.SEQUENCE**:对于支持序列的数据库(如Oracle),使用数据库的序列来生成主键,提供了一种高性能的解决方案。 - **GenerationType.AUTO**:由持久化管理器根据其自身的能力和配置来选择合适的...
### Oracle主键自动增长知识点详解 #### 一、Oracle序列(Sequence)的使用方法 ...通过这些技术,可以在不依赖于数据库本身的特性的情况下,灵活地实现主键的自增,从而满足各种应用场景的需求。
因此,如何设计一种高效的全局自增ID生成方案成为了一个重要的技术问题。 #### 方案调研与实践 **一、数据库自增ID方案** ##### Flicker方案解析 Flicker提出的解决方案是利用MySQL自身的auto_increment特性来...
一种解决办法是通过创建一个专门的表来生成ID,如创建一个名为`create_id`的表,其中包含一个自增主键`id`。当需要新的ID时,执行插入操作并获取最后插入的ID。在PHP中,可以通过类似以下的函数实现: ```php ...
一种可能的解决方案是使用`LAST_INSERT_ID()`函数,这是一个MySQL特有的SQL函数,可以在更新语句后立即获取自增主键的最新值。然而,这需要在Mybatis的映射文件中添加额外的逻辑来执行查询。 总之,Mybatis的`...
在MySQL数据库中,自增ID(AUTO_INCREMENT)是一种常见的用于主键字段的特性,它会自动为新插入的行提供唯一的标识符,每次插入新行时递增。然而,在某些场景下,例如数据库初始化或者数据清理后,我们可能需要让...
在MySQL中,自增序列(Sequence)是一种常用于生成唯一标识符的数据结构,尤其是在Oracle数据库中广泛使用。然而,MySQL自身并不直接支持Sequence,但可以通过创建表和存储过程来模拟这个功能。本教程将详细解释如何...
在Java开发中,高效地生成唯一且自增的ID是许多系统设计的关键部分。"Java快速ID自增器"就是为了解决这个问题而设计的一种工具或解决方案。...选择哪种方案取决于具体的应用场景、性能需求以及系统是否分布式。
SQL Server 平台修改自增列值 由于之前处理过sql server数据库的迁移工作,尝试过其自增列值的变更,但是通过SQL 语句修改自增列值,是严格不允许的,直接报错(无法更新标识列 ‘自增列名称‘)。sql server我测试...
总的来说,选择哪种双活同步复制方案取决于应用的需求、数据一致性要求、系统规模、并发处理能力和网络条件。每种方案都有其优点和限制,需要根据实际情况做出选择,并进行适当调整以优化性能和稳定性。
MySQL 的 REPLACE INTO 语句可以处理主键冲突,它会删除与新插入记录主键值相同的旧记录,然后插入新记录。但是,这可能导致数据丢失,因为原有的行将被完全替换: ```sql REPLACE INTO your_table(primary_key_...
MongoDB作为一款非关系型数据库,不像传统的关系型数据库如MySQL那样提供内置的自增字段功能。然而,这并不意味着无法在MongoDB中实现自增功能。本文将详细介绍一种使用Python和MongoDB实现自增键值的简单方法。 ...
了解这些关于MySQL自增ID的知识点,可以帮助我们更好地设计数据库表结构,优化查询性能,并有效管理数据增长。在实际应用中,合理地使用和规划自增ID可以避免许多潜在问题,提高数据库系统的稳定性和效率。
在MySQL数据库中,序列或ID生成方案是数据库设计的关键部分,尤其对于高并发系统而言,高效且无冲突的ID生成机制至关重要。本方案主要探讨如何在MySQL中实现一个可靠的序列/ID生成策略,以满足并发处理的需求。 ...
### 数据库主键设计原则详解 #### 一、引言 在数据库设计中,主键的设计至关重要,它不仅关系到数据的唯一性,还影响着数据检索...无论哪种方案,都需充分评估其优缺点,确保既能满足当前需求又能适应未来的扩展。