在只使用单数据库时,使用自增主键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面试题主键自增
mysql修改自增主键初始值,简单易操作,数据库维护小技巧。
在oracle中可以利用触发器创建自增,从而完成我们像在sql server与mysql中定义的主键自增的功能。从而方便我们的开发
mybatis进行插入操作时,如果表的主键是自增的,...基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置。
MySQL8自增主键变化.doc
备集群,每台机器部署一个集群2 测试方法非主键自增的表结构: non_increment(c1 int primary key auto_increment,
面试官:”用过mysql吧,你们是用自增主键还是UUID?” 你:”用的是自增主键” 面试官:”为什么是自增主键?” 你:”因为采用自增主键,数据在物理结构上是顺序存储,性能最好,blabla…” 面试官:”那自增主键...
mysql用触发器实现char类型主键自增长
在mysql中,直接把表的主键设为auto_increment类型,在MS SQLServer中,如果把表的主键设为identity类型, 在Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给...
设置一张MySQL表,表里有一个自增主键ID,往表里插入数据,假如插入数据之后表后一行的ID是100,我先删除这条ID为100的记录,然后重新启动服务器,按理说如果再往这个表里插入新的记录,新纪录的ID将为101,对吧...
。
非主键自增,可以控制按照每天或者每月每年自增,可以控制位数,前缀后缀,返回值中间也可以按照要求拼接。数据库方式实现。
小A正在balabala写代码呢,DBA小B突然发来了一条消息,“快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了,插入就会失败,balabala……” ...
HeidiSQL 是一款用于简单化你的 MySQL 服务器和数据库管理的图形化界面。该软件允许你浏览你的数据库,管理表,浏览和编辑记录,管理用户权限等等。此外,你可以从文本文件导入数据,运行 SQL查询,在两个数据库之间...
MySQL的自增ID(主键) 用完了,怎么办? 如果用 int unsigned (int,4个字节 ), 我们可以算下最大当前声明的自增ID最大是多少,由于这里定义的是 int unsigned,所以最大可以达到2的32幂次方 – 1 = 4294967295。 ...
前几天开发的同事反馈一个利用load data infile命令导入数据主键冲突的问题,分析后确定这个问题可能是mysql的一个bug,这里提出来给大家分享下。以免以后有童鞋遇到类似问题百思不得其解,难以入眠,哈哈。
自增主键没有持久化是个比较早的bug,这点从其在官方bug网站的id号也可看出(https://bugs.mysql.com/bug.php?id=199)。由Peter Zaitsev(现Percona CEO)于2003年提出。历史悠久且臭名昭著。 首先,直观的重现下。...
mysql 数据库自增id 的总结.docx
本文实例讲述了mysql非主键自增长用法。分享给大家供大家参考,具体如下: mysql并非只有主键才能自增长,而是设为键的列就可以设置自增长。 如下: CREATE TABLE t1 ( id INT, col1 INT auto_increment NOT NULL...