由于数据量以及IO效率的因素,很多项目对数据支持的数据库会采取分库分表的方式。使用了分库分表之后需要解决的一个问题就是主键的生成。多个表之间的主键就不能用数据库本身的自增主键来支持,因为不同表之间生成的主键会重复。所以需要其他的方式获取主键ID。

一般来说解决方案主要有三种:

  1. oracle sequence : 基于第三方oracle的SEQ.NEXTVAL来获取一个ID 优势:简单可用 缺点:需要依赖第三方oracle数据库
  2. mysql id区间隔离 : 不同分库设置不同的起始值和步长,比如2台mysql,就可以设置一台只生成奇数,另一台生成偶数. 或者1台用0~10亿,另一台用10~20亿. 优势:利用mysql自增id 缺点:运维成本比较高,数据扩容时需要重新设置步长.
  3. 基于数据库更新+内存分配: 在数据库中维护一个ID,获取下一个ID时,会对数据库进行ID=ID+100 WHERE ID=XX,拿到100个ID后,在内存中进行分配 优势:简单高效 缺点:无法保证自增顺序

考虑到扩展性和维护性,我们采取了第三种方案。具体实现为:

  1. 我们设置获取ID步长为l,一共有n个表分配id。
  2. 初始化后,n个表中的id值分别为0,l, 2l,3l…
  3. 当应用从任意一个表获取ID,这个表中的ID会在原ID值上增加nl。

举例说明,步长为100,共4个id表

  1. 初始化后,4个表中的值分别为, 1:0, 2:100, 3:200, 4:300
  2. 假设应用从表2获取了id,那么四个表的值变为,1:0, 2:500, 3:200, 4:300

这样一来有如下几个好处:

  1. 实现了全局唯一ID。
  2. 不影响业务数据库的扩展。
  3. 获取ID有容灾,单个表无法访问不影响全局。

MySQL分布式实现ID自增的更多相关文章

  1. cmd中mysql主键id自增,在添加信息时发生错误,再次成功添加时,id已经跳过错误的信息继续自增。

    id 自增,在往这个表里添加信息时 发生错误,再次添加 id数值已经跳过之前

  2. mysql 设置默认id自增开始下标

    alter table 表名 AUTO_INCREMENT 此处写你想让id从几开始增长的数字:

  3. 分布式唯一ID自增(雪花算法)

    public class IdWorker { // ==============================Fields===================================== ...

  4. mysql数据库单表只有一个主键自增id字段,ibatis实现id自增

    mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid">        insert into user_id ...

  5. id生成器,分布式ID自增算法(Snowflake 算法)

    接口: /** * id生成器 */ public interface IdGenerator { String next(); } 实现类: /** * 分布式ID自增算法<br/> * ...

  6. Mysql数据库表的自增主键ID号乱了,需要重新排列。

    Mysql数据库表的自增主键ID号乱了,需要重新排列. 原理:删除原有的自增ID,重新建立新的自增ID. 1,删除原有主键:ALTER TABLE `table_name` DROP `id`; 2, ...

  7. mysql id 自增实现

    1.在mysql中建表 2.使用: >insert into 表名 values(id,'www',66); 连续运行5次后结果: =============================== ...

  8. mysql实现id自增

    用下面这句话就可以实现插入mysql数据时候实现id自增 create table shuju (id int(10) auto_increment primary key,name varchar( ...

  9. 解决在mysql表中删除自增id数据后,再添加数据时,id不会自增1的问题

    https://blog.csdn.net/shaojunbo24/article/details/50036859 问题:mysql表中删除自增id数据后,再添加数据时,id不会紧接.比如:自增id ...

随机推荐

  1. mongodb添加验证用户 删除用户

    1.创建用户 db.createUser( { user:<name_string>,                   #字符串 pwd:<password_string> ...

  2. mac 打印机无法打印

    每次打印word的时候都无法正常打印,提示嘀嘀响声. 文件->页面设置-> 纸张A4 即可

  3. prime 又一个开源的基于graphql 的cms

    prime 是一个开源的基于graphql 的cms,类似的已经又好多了,strapi 就是一个(graphql 是通过插件扩展的) graphcms 是一款不错的,但是是收费的,prime 是基于t ...

  4. python中a, b = a, a + b

    python中a, b = a, a + b a = 0 b = 1 计算a, b = a, a + b,先计算赋值号右边的部分,即 a = 0, a + b = 0+1=1,然后再赋值给左边 也可以 ...

  5. Zookeeper常用操作命令 ls,ls2,get和stat

    一.启动zk客户端 进入bin目录 cd  /usr/local/zookeeper-3.4.13/bin ./zkCli.sh 出现如下界面,说明已经连接上了 二.ls与ls2命令 1. ls pa ...

  6. postman测试post请求参数为json类型

    1. 设置Headers Content-Type类型为application/json 2.Body 设置如下.请求的数据类型为Json格式

  7. itertools.groupby()/itertools.compress() 笔记

    关于itertools.groupby() itertools.groupby()就是将相邻的并且相同的键值划分为同一组,相似功能可以看https://docs.python.org/3/librar ...

  8. ASP.NET AJAX入门系列(5):使用UpdatePanel控件(二) UpdatePanel

    UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加 ...

  9. mysql show master status为空值

    问题 执行show master status,输出结果为空: mysql> show master status; Empty set (0.00 sec) 原因 mysql没有开启日志. 查 ...

  10. Myeclipse 配置Git详解

    Myeclipse+Git EGit安装 MyEclipse已经集成了Git插件EGit,在window->Preference里搜索git可以看到.   如果没有,安装方式为Help-> ...