mysql全局唯一ID生成方案(二)
MySQL数据表结构中,一般情况下,都会定义一个具有‘AUTO_INCREMENT’扩展属性的‘ID’字段,以确保数据表的每一条记录都可以用这个ID唯一确定;
随着数据的不断扩张,为了提高数据库查询性能,降低查询热点,一般都会把一张表按照一定的规则分成多张数据表,即常说的分表;
分表除了表名的索引不同之外,表结构都是一样的,如果各表的‘ID’字段仍采用‘AUTO_INCREMENT’的方式的话,ID就不能唯确定一条记录了。
这时就需要一种处于各个分表之外的机制来生成ID,我们一般采用一张单独的数据表(不妨假设表名为‘ticket_mutex’)来保存这个ID,无论哪个分表有数据增加时,都是先到ticket_mutex表把ID值加1,然后取得ID值。
这个取ID的操作看似很复杂,所幸的是,MySQL提供了LAST_INSERT_ID机制,让我们能一步完成。
1、新建数据表ticket_mutex
CREATE TABLE ticket_mutex (
name varchar(32) NOT NULL PRIMARY KEY COMMENT '业务名称',
value bigint(20) UNSIGNED NOT NULL COMMENT 'ID值'
)Engine=InnoDB DEFAULT CHARSET=UTF8 COMMENT '保存分表ID表';
字段‘name’用来说明这个ID是哪个业务的,比如‘用户’的ID,我们可以定为‘USER’;
字段‘value’即该业务的ID值。
2、初始化业务和其ID值
INSERT INTO ticket_mutex(name, value) values('USER', 0),('POST', 0);
+------+-------+
| name | value |
+------+-------+
| POST | 0 |
| USER | 0 |
+------+-------+
我们初始化了2条记录,即有2个不同的业务,分别代表‘用户信息’和‘主题信息’,它们初始ID值均为‘0’;
3、获取分表唯一ID
这个时候就要利用MySQL提供的LAST_INSERT_ID()机制了。
在往用户表里新增一条数据时,获取‘用户ID’:
UPDATE ticket_mutex SET value=LAST_INSERT_ID(value+1) WHERE name='USER';SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
通过这条语句之后,我们得到结果为1,这个值就是我们所需要的值。再来查看数据记录,我们发现记录总数没有改变,但是‘用户’的ID已经为1了;
+------+-------+
| name | value |
+------+-------+
| POST | 0 |
| USER | 1 |
+------+-------+
同样的方法,我们可获取‘主题’的ID:
UPDATE ticket_mutex SET value=LAST_INSERT_ID(value+1) WHERE name='POST';SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
查看所有的记录:
+------+-------+
| name | value |
+------+-------+
| POST | 1 |
| USER | 1 |
+------+-------+
从上可以看出,通过MySQL的LAST_INSERT_ID机制,我们可以保证在记录总数不增长的情况下,让业务ID在不断的增加,从而保证了分表ID的唯一性。
4、LAST_INSERT_ID说明
从名字可以看出,LAST_INSERT_ID即为最后插入的ID值,根据MySQL的官方手册说明,它有2种使用方法
一是不带参数:LAST_INSERT_ID(),这种方法和AUTO_INCREMENT属性一起使用,当往带有‘AUTO_INCREMENT’属性字段的表中新增记录时,LAST_INSERT_ID()即返回该字段的值,大家可试下(我已经验证过);
二是带有表达式:如上面介绍的LAST_INSERT_ID(value+1),它返回的是表达式的值,即‘value+1’;
---------------------
作者:Jef冒牌绅士
来源:CSDN
原文:https://blog.csdn.net/longjef/article/details/53117392
版权声明:本文为博主原创文章,转载请附上博文链接!
mysql全局唯一ID生成方案(二)的更多相关文章
- (4.24)【mysql、sql server】分布式全局唯一ID生成方案
参考:分布式全局唯一ID生成方案:https://blog.csdn.net/linzhiqiang0316/article/details/80425437 分表生成唯一ID方案 sql serve ...
- 关于全局唯一ID生成方法
引:最近业务开发过程中需要涉及到全局唯一ID生成.之前零零总总的收集过一些相关资料,特此整理以便后用 本博客已经迁移至:http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...
- 【系统设计】分布式唯一ID生成方案总结
目录 分布式系统中唯一ID生成方案 1. 唯一ID简介 2. 全局ID常见生成方案 2.1 UUID生成 2.2 数据库生成 2.3 Redis生成 2.4 利用zookeeper生成 2.5 雪花算 ...
- 分布式系统唯一ID生成方案
分布式系统唯一ID生成方案汇总 数据库自增主键 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2)数字ID天然排序,对分页或者需要排序的结果很有帮助. 缺点: ...
- 分布式系统全局唯一ID生成
一 什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息, ...
- 分布式唯一ID生成方案是什么样的?(转)
一.前言 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法承接,就会对其进行分库分表. 但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题, ...
- 分布式全局唯一ID生成策略
一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法承接,就会对其进行分库分表. 但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题. ...
- 分布式全局唯一ID生成策略
为什么分布式系统需要用到ID生成系统 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据库的分库分表后需要有 ...
- 一线大厂的分布式唯一ID生成方案是什么样的?
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
随机推荐
- 转载mysql数据库配置优化
网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一 ...
- Redis 操作列表数据
Redis 操作列表数据: > lpush list1 "aaa" // lpush 用于追加列表元素,默认追加到列表的最左侧(left) (integer) > lp ...
- no matching function for call to ‘std::basic_string<char>::assign(std::string&, int)
使用string中的assign赋值函数报错,代码为: text0.assign(line,i+); 其中text0与line都为string类型 最后发现assign函数的原型为 string &a ...
- 基于ThinkPHP3.23的简单ajax登陆案例
本文将给小伙伴们做一个基于ThinkPHP3.2.的简单ajax登陆demo.闲话不多说.直接进入正文吧. 可能有些小伙伴认为TP自带的跳转页面挺好,但是站在网站安全的角度来说,我们不应该让会员看到任 ...
- 《转》python学习(12)-列表解析
转自 http://www.cnblogs.com/BeginMan/p/3164937.html 一.列表解析 列表解析来自函数式编程语言(haskell),语法如下: [expr for iter ...
- C语言预处理命令详解
一 前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能 ...
- 【MySQL8】 安装后的简单配置(主要解决navicat等客户端登陆报错问题)
一.navicat等客户端登陆报错的原因 使用mysql,多数我们还是喜欢用可视化的客户端登陆管理的,个人比较喜欢用navicat.一般装好服务器以后,习惯建一个远程的登陆帐号,在mysql8服务器上 ...
- 浏览器缓存机制介绍 + 常用 http 状态码
浏览器缓存分为两种, 强制缓存 与 协商缓存, https://www.pass4lead.com/300-209.htmlhttps://www.pass4lead.com/300-320.ht ...
- php guzzle post async
use GuzzleHttp\Pool;use GuzzleHttp\Client;//use GuzzleHttp\Psr7\Request;use Psr\Http\Message\Respons ...
- 基于Python的跨平台端口转发工具
背景 使用lcx也好,nc也好,总是会被安全防护软件查杀,所以想着自己写一个.顺面学习一下,端口转发的原理. 端口转发的逻辑 端口转发的逻辑很简单开启两个scoket,一个绑定IP端口进行listen ...