MySQL分布式实现ID自增
由于数据量以及IO效率的因素,很多项目对数据支持的数据库会采取分库分表的方式。使用了分库分表之后需要解决的一个问题就是主键的生成。多个表之间的主键就不能用数据库本身的自增主键来支持,因为不同表之间生成的主键会重复。所以需要其他的方式获取主键ID。
一般来说解决方案主要有三种:
- oracle sequence : 基于第三方oracle的SEQ.NEXTVAL来获取一个ID 优势:简单可用 缺点:需要依赖第三方oracle数据库
- mysql id区间隔离 : 不同分库设置不同的起始值和步长,比如2台mysql,就可以设置一台只生成奇数,另一台生成偶数. 或者1台用0~10亿,另一台用10~20亿. 优势:利用mysql自增id 缺点:运维成本比较高,数据扩容时需要重新设置步长.
- 基于数据库更新+内存分配: 在数据库中维护一个ID,获取下一个ID时,会对数据库进行ID=ID+100 WHERE ID=XX,拿到100个ID后,在内存中进行分配 优势:简单高效 缺点:无法保证自增顺序
考虑到扩展性和维护性,我们采取了第三种方案。具体实现为:
- 我们设置获取ID步长为l,一共有n个表分配id。
- 初始化后,n个表中的id值分别为0,l, 2l,3l…
- 当应用从任意一个表获取ID,这个表中的ID会在原ID值上增加nl。
举例说明,步长为100,共4个id表
- 初始化后,4个表中的值分别为, 1:0, 2:100, 3:200, 4:300
- 假设应用从表2获取了id,那么四个表的值变为,1:0, 2:500, 3:200, 4:300
这样一来有如下几个好处:
- 实现了全局唯一ID。
- 不影响业务数据库的扩展。
- 获取ID有容灾,单个表无法访问不影响全局。
MySQL分布式实现ID自增的更多相关文章
- cmd中mysql主键id自增,在添加信息时发生错误,再次成功添加时,id已经跳过错误的信息继续自增。
id 自增,在往这个表里添加信息时 发生错误,再次添加 id数值已经跳过之前
- mysql 设置默认id自增开始下标
alter table 表名 AUTO_INCREMENT 此处写你想让id从几开始增长的数字:
- 分布式唯一ID自增(雪花算法)
public class IdWorker { // ==============================Fields===================================== ...
- mysql数据库单表只有一个主键自增id字段,ibatis实现id自增
mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid"> insert into user_id ...
- id生成器,分布式ID自增算法(Snowflake 算法)
接口: /** * id生成器 */ public interface IdGenerator { String next(); } 实现类: /** * 分布式ID自增算法<br/> * ...
- Mysql数据库表的自增主键ID号乱了,需要重新排列。
Mysql数据库表的自增主键ID号乱了,需要重新排列. 原理:删除原有的自增ID,重新建立新的自增ID. 1,删除原有主键:ALTER TABLE `table_name` DROP `id`; 2, ...
- mysql id 自增实现
1.在mysql中建表 2.使用: >insert into 表名 values(id,'www',66); 连续运行5次后结果: =============================== ...
- mysql实现id自增
用下面这句话就可以实现插入mysql数据时候实现id自增 create table shuju (id int(10) auto_increment primary key,name varchar( ...
- 解决在mysql表中删除自增id数据后,再添加数据时,id不会自增1的问题
https://blog.csdn.net/shaojunbo24/article/details/50036859 问题:mysql表中删除自增id数据后,再添加数据时,id不会紧接.比如:自增id ...
随机推荐
- 【HAOI2015】 T1
为什么感觉越来越迷了X. X 原题: 有一棵点数为 N 的树,树边有边权.给你一个在 0~N 之内的正整数 K,你要在这棵树中选择 K 个点,将其染成黑色,并将其他的N-K 个点染成白色.将所有点染色 ...
- 一篇文章看懂java反射机制(反射实例化对象-反射获得构造方法,获得普通方法,获得字段属性)
Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象传入一个包名+类名的字符串就可以得到C ...
- Compoxure example 应用说明
Compoxure 官方提供了一个demo应用,包含了cache,error,layout 等功能 环境准备 demo 使用docker-compose 运行 clone 代码 git clone h ...
- vm centos7中用NAT模式配置上网
第一步:设置虚拟机的NAT相关网络设置: 点击5标致处的“NAT设置”会出现设置6标致处的网关. 第二部:设置操作系统网络设置,右击上图中9标致处的系统,点击设置 第三部:配置操作系统ip ...
- VBA: 怎样批量数据从Excel派出到Visio
上周派到了个case, 是批量从Excel导出数据导Visio每个图形中. 花了些时间实现了这个功能. 原理如下: 打开Excel 新建/打开表单 指向所选择的表单 遍历所在列的所有数据 打开Visi ...
- 《代码大全》的作者Steve McConnell
Steve McConnell是Construx公司首席软件工程师,在公司里监督软件工程实施.他是软件工程知识体(SWEBOK) 项目构建知识领域的领导.Steve曾为微软公司.波音公司和西雅图地区的 ...
- css3中的BFC,IFC,GFC和FFC
出处:https://www.jianshu.com/p/e75f351e11f8 表格比较: 名称 英文全称 含义 BFC Block Formatting Contexts 块级格式化上下文 IF ...
- Oracle ID 自增
实现Oracle Id自增 1.方法一(Oracle Version Oracle 12c版本支持) create table app_student( id integer generated by ...
- C# 生成指定N位随机码
/// <summary> /// 获取随机码 /// </summary> /// <param name="length">长度</p ...
- Spring Cloud Feign Ribbon 配置
由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...