在应用mysql时,主键id通常作自动增长,这种效率怎么样?在没有主从架构,集群环境下,通常这种是最方便的,?
但在集群,主从架构环境中,不考虑这种实现,如何实现唯一id呢?
在只使用单数据库时,使用自增主键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 相对分段的效果来满足全局唯一的效果。优点是实现简单,后期维护简单,对应用透明。缺点是第一次设置相对较为复杂。
说明:避免重合需要多种方案结合
使用UUID作为主键带来的问题:
对于InnoDB这种聚集主键类型的引擎来说,数据会按照主键进行排序,由于UUID的无序性,InnoDB会产生巨大的IO压力,此时不适合使用UUID做物理主键,可以把它作为逻辑主键,物理主键依然使用自增ID。
首先,innodb会对主键进行物理排序,这对auto_increment_int是个好消息,因为后一次插入的主键位置总是在最后。但是对uuid来 说,这却是个坏消息,因为uuid是杂乱无章的,每次插入的主键位置是不确定的,可能在开头,也可能在中间,在进行主键物理排序的时候,势必会造成大量的 IO操作影响效率。
这个问题解决起来办法不多,比较常见的方式是主键仍然用auto_increment_int来做,而另加一个uuid做唯一索引,表外键关联什么的,还 用uuid来做,也就是说auto_increment_int只是一个形式上的主键,而uuid才是事实上的主键,这样,一方面int主键不会浪费太多 空间,另一方面,还可以继续使用uuid。
1、最简单的方法
4台数据库,第一台mysql主键从1开始每次加4,第二台从2开始每次加4,以此类推。。
2、搭建sequence server
2.1、选用N台mysql作为sequence server,防止单点故障。
2.2、每个server上的每张表都代表一个序列,每张表也只有一条记录(表级锁,选用myisam引擎)。
2.3、第一台server的序列从1开始每次加N,第二台从2开始每次加N。
2.4、获取时先从第一台server上获取nextVal并修改nextVal加N,如果第一台Server获取失败,则从第二台Server上获取。。
修改MySQL默认自动增长的步长
set global auto_increment_increment=1; — 设置序列的增长值
show global variables; — 显示所有的global变量
show global variables like ‘%test%’ — 查询包含test字符串的global变量
相关推荐
"分布式数据库唯一主键设计"涉及到如何在多节点、多表环境中创建并管理这种全局唯一的标识符。本文将深入探讨这一主题,旨在帮助读者理解如何在分布式环境中有效地设计和实现唯一主键。 一、主键的概念与重要性 ...
他们可能提出了一些创新性的解决方案,例如,采用高效的哈希算法或者序列号生成策略来确保主键的唯一性,同时可能还设计了适应分布式环境的事务处理机制,以保证在高并发情况下的正确性和性能。此外,论文可能还讨论...
### 数据库主键设计原则详解 #### 一、引言 在数据库设计中,主键的设计至关重要,它不仅关系到数据的唯一性,还影响着数据检索效率以及系统的整体性能。本文将根据提供的描述和部分内文,深入探讨数据库主键设计...
Sharding-JDBC 是一种流行的分布式数据库中间件,它旨在解决大数据量和高并发场景下的数据库性能瓶颈问题。 **分片** 是分布式数据库中的关键概念,主要是为了提升系统的横向扩展性。分片策略包括根据业务需求进行...
NewSQL是在大数据应用背景下产生的新型分布式数据库系统。NewSQL是基于对传统数据库进行挑战的一类新型分布式数据库系统,其旨在为OLTP(在线事务处理)读写负载提供与NoSQL系统相同的扩展性能,同时提供传统数据库...
分布式数据库架构通过将数据分散存储在多个节点上,实现了系统的高可用性和水平扩展能力,降低了对昂贵硬件的依赖。 Oracle RAC(Real Application Clusters)是一种流行的共享存储数据库集群解决方案。它允许多个...
分布式数据库是一种将数据分散存储在多个物理位置的数据库系统,它具有高可用性、扩展性和容错性等优点。在研究生级别的分布式数据库考试中,可能会涉及到以下知识点: 1. **分布库管理系统的主要功能模块**: - *...
通过介绍链接服务器、分布式分区视图、存储过程以及数据库复制技术的应用,本文旨在为读者提供一套可行的分布式数据库设计方案。 #### 关键词 分布式数据库、分布式分区视图、链接服务器、存储过程 #### 1. 引言 ...
分布式数据库是现代大数据处理的关键组件,它允许在多台服务器之间分布数据,以实现高可用性、可伸缩性和性能优化。本文将深入探讨两个重要的分布式数据库系统:Hypertable和HBase,它们都是受到Google核心技术启发...
2. **工作机器ID**:CosID支持多节点并行生成ID,通过分配给每个节点一个唯一的标识,可以区分不同节点生成的ID,从而实现分布式环境下的主键生成。 3. **序列号**:在每个节点内,CosID还引入了一个自增序列号,...
分布式主键发生器的设计目标是确保在分布式环境下的各个节点能够独立且无冲突地生成唯一的ID,以满足数据库表中主键字段的约束。 描述中提到“基于java的分布式主键发生器”,这表明该系统使用Java语言实现,Java...
因此,分布式数据库的应用应运而生,它通过分库与分表策略来存储数据,不仅可以有效解决存储问题,而且还能降低服务器成本,提高企业竞争力。 分库与分表策略是分布式数据库管理的重要方式。分库即将数据按照某种...
在阿里巴巴B2B平台中,分布式数据库解决方案旨在应对海量数据处理需求,并确保系统的高可用性和灵活性。主要分为以下几个部分: ##### 1. 分布式数据存储与访问 —— Cobar Cobar是阿里巴巴内部开发的一个用于...
分布式数据库是一种先进的数据库解决方案,它将数据分散存储在多台计算机上,通过网络进行通信,以提高系统的可扩展性、性能和容错性。在分布式数据库产品中,通常包括多种类型的数据存储产品,如关系型数据库、关系...
分布式锁是在分布式系统环境中实现的一种锁机制,用于控制多个节点对共享资源的访问。当多个服务或实例需要同时操作同一份资源时,分布式锁可以保证在任意时刻只有一个服务能获得锁并进行操作,从而避免并发冲突。 ...
分布式NoSQL数据库Fusion是滴滴公司为应对日益增长的业务需求而开发的一种创新数据库解决方案。它的主要目标是在Redis和MySQL之间找到一个平衡点,作为主存储数据库,提供一种兼容Redis协议的分布式NoSQL服务。 **...
基于Oracle的分布式数据库设计与技术是解决大规模、多地点数据管理和协作的有效方案。通过数据库链接、分布式事务、数据一致性保证等手段,企业可以构建起安全、可靠、高效的分布式信息系统。在直销员工资系统的实例...
分布式数据库是IT行业中一种重要的数据管理技术,它允许跨多个物理位置和多个服务器存储、管理数据,是现代大数据和云计算环境中的关键组件。在给出的内容中,重点介绍了分布式数据库的实践应用,以及名为Spider的...