数据库自增ID机制原理介绍

在分布式里面,数据库的自增ID机制的主要原理是:数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace into跟insert功能类似,不同点在于:replace into首先尝试插入数据列表中,如果发现表中已经有此行数据(根据主键或唯一索引判断)则先删除,再插入。否则直接插入新数据。

单机mysql数据库的自增id实现如下所示 :

首先表结构如下所示

create table t_test(

id bigint(20) unsigned not null auto_increment PRIMARY KEY,

stub char(1) not null default '',

unique key stub (stub)

)

然后我们插入的sql语句和查询的语句如下所示

replace into t_test (stub) values('b');

select last_insert_id();

此时可以看到看到我们刚刚插入的id值是1

以上就是单机版mysql的自增id的实现过程,但是这里讲的是分布式id,所以我们要分析一下数据库的自增ID机制在分布式里面是怎么实现的。

分布式id在数据库里面的实现过程:

既然是分布式id,那么最少要使用两个数据库,这里我们使用3台来讲解,为了保证每一台数据库里面的id自增的时候不会重复,那么我们就要给每一台数据库设置auto-increment-increment和auto-increment-offset这两个属性值(auto-increment-increment表示每一台数据库的起始id值,然后auto-increment-offset表示每一台数据库每一次的增加数字),设置值如下所示

Server1:

auto-increment-increment = 1

auto-increment-offset = 3

Server2:

auto-increment-increment = 2

auto-increment-offset = 3

Server2:

auto-increment-increment = 3

auto-increment-offset = 3

那么如果我们有n台数据库的话,那么上面的auto-increment-increment和auto-increment-offset这两个属性值应该怎么设计呢,我们给每一台数据库设置初始值分别为1,2,3...N,然后每一台数据库自增步长为机器的台数N,如下图所示

数据库自增ID是否适合做分布式ID:

那数据库自增ID机制适合作分布式ID吗?答案是不太适合,为什么呢,我总结了下面两个原因:

1:系统水平扩展比较困难,比如定义好了步长和机器台数之后,如果要添加机器该怎么做?假设现在只有一台机器发号是1,2,3,4,5(步长是1),这个时候需要扩容机器一台。可以这样做:把第二台机器的初始值设置得比第一台超过很多,比如14(主要这里设置14的前提是:在扩容期间第一台机器的ID不可能增加到14),同时设置步长为2,那么这台机器下发的号码都是14以后的偶数。然后摘掉第一台,把ID值保留为奇数,比如7,然后修改第一台的步长为2。让它符合我们定义的号段标准。扩容方案看起来复杂吗?貌似还好,现在想象一下如果我们线上有100台机器,这个时候要扩容该怎么做?简直是噩梦。所以系统水平扩展方案复杂难以实现。

2:数据库压力还是很大,每次获取ID都得读写一次数据库,非常影响性能,不符合分布式ID里面的延迟低和要高QPS的规则(在高并发下,如果都去数据库里面获取id,那是非常影响性能的)

看到这里的同学,觉得好的话就帮忙推荐下吧,Thanks♪(・ω・)ノ

MySQL分布式ID_分布式唯一ID系列(3)——数据库自增ID机制适合做分布式ID吗相关推荐

  1. mysql b 树原因_复习系列之数据库(四):MySQL为什么采用B+树作为索引结构?

    MySQL中数据是索引组织表,即表中数据按照主键顺序存放.所以就可以基于索引这种数据结构实现一些高级算法,来提高检索效率. 常见的查找算法 顺序查找:复杂度O(n),在数据量大时,效率很低 二分查找: ...

  2. hibernate mysql 例子_Hibernate的基本功能:对数据库的增删改查(创建对象实例)...

    一.通过实例化的对象向数据库添加新记录 packagecom.yh.test;importorg.hibernate.Session;importorg.hibernate.SessionFactor ...

  3. mysql男女字段应该建立索引吗_为什么说性别字段不适合做索引?

    关于区分度不高的字段,比如性别,比如状态字段,是否应该建索引? 只有2种取值的字段,建了索引数据库也不一定会用,只会白白增加索引维护的额外开销,因为索引也是需要存储的,所以插入和更新的写入操作,同时需 ...

  4. memcached java 客户端优化,分布式缓存技术memcached学习系列(五)—— memcached java客户端的使用...

    Memcached的客户端简介 我们已经知道,memcached是一套分布式的缓存系统,memcached的服务端只是缓存数据的地方,并不能实现分布式,而memcached的客户端才是实现分布式的地方 ...

  5. Arteon/ID.系列等 大众2021新车展望

    大众的电动车是最近热议的一个话题,车型名称显示它将会是一个新的系列,已知部分车型名称有ID.3.ID.4.ID.5.ID.6等,目前ID.4已经支持预订,而有的车型还处于谍照阶段,现在咱就以现有的资料 ...

  6. MySQL导入csv文件内容到Table及数据库的自增主键设置

    写在前面 目的是测试将csv文件内容导入到表中, 同时记录一下自增主键的设置. 测试采用MySQL8.0. 新建表customer_info如下, 未设置主键. 修改上表, 添加主键id, 并设置为自 ...

  7. mysql linux导入csv主键,MySQL导入csv文件内容到Table及数据库的自增主键设置

    写在前面 目的是测试将csv文件内容导入到表中, 同时记录一下自增主键的设置. 测试采用MySQL8.0. 新建表customer_info如下, 未设置主键. 修改上表, 添加主键id, 并设置为自 ...

  8. Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案

    Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 参考文章: (1)Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 (2)https://www.cnblogs.com/ ...

  9. js生成唯一id_【融云分析】如何实现分布式场景下唯一 ID 生成?

    ◀背景▶ 对于一套分布式部署的 IM 系统,要求每条消息的 ID 要保证在集群中全局唯一且按生成时间有序排列.如何快速高效的生成消息数据的唯一 ID ,是影响系统吞吐量的关键因素.那么,融云是如何做到 ...

最新文章

  1. 企业级-Mysql双主互备高可用负载均衡架构(基于GTID主从复制模式)(原创)
  2. ThinkPad安装deepin操作系统报错解决方法
  3. Vue.js 是什么
  4. c语言求出字符串最长单词,C语言-获取字符串中最长的单词.doc
  5. MySQL String Types
  6. Mac OS X搭建C#开发环境
  7. Go编译android,在Android中引用golang编译的aar包
  8. IT职业生涯中的必修课
  9. JVM学习02-虚拟机的基本结构
  10. PHP拼接唯一索引,合并两个数组数据
  11. 饿汉式单例模式,懒汉式单例模式
  12. 人大金仓数据库 Windows安装教程 -kingbase8R6
  13. mariaDB安装与配置
  14. Python 错误 RuntimeError: CUDA error (10): invalid device ordinal
  15. python 给文件加密
  16. 算法-查找(红黑树)
  17. 计算机网络mtu值设置,应该如何设置mtu值才可以让网速达到最快-电脑自学网
  18. 【夏季美女们穿的“清凉”容易引男生的狼眼】
  19. 写给程序员的管理入门课程(转)
  20. 然而马云并没有收购车投网

热门文章

  1. mysql8.0.12插件_MySQL8.0.12 安装及配置
  2. 框架实现修改功能的原理_JAVA集合框架的特点及实现原理简介
  3. linux脚本打印循环次数,shell脚本编程基础(3)——循环用法
  4. 5gnr帧结构特点有哪些_PLC控制柜有哪些结构特点呢?
  5. C#判断闰年函数及举例
  6. Android之SparseArray<E>详解
  7. 衡量计算机浮点数操作性能,计算机系统基础:计算机性能评价知识笔记
  8. resque java_php-resque :基于Redis的后台任务系统
  9. sql年月日24小时制_24小时制的「无码」真人秀,令人叫绝
  10. 它是世界上最轻的固体!1000℃下不会熔化,上过火星,还能进你家......