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 ...
随机推荐
- 使用 PyQuery
PyQuery 用法: (1) 前面我们爬取一个网页,都是使用正则表达式来提取想要的信息,但是这种方式比较复杂,一旦有一个地方写错,就匹配不出来了,因此我们可以使用 PyQuery(2) PyQuer ...
- samba 服务器
1.apt-get install smaba 2.安装完成后apt-get install smbclient 然后就是配置那个.conf文件,这个到网上搜下ubuntu下配置smaba服务器就可以 ...
- MQTT服务器搭建--Mosquitto用户名密码配置
Mosquitto用户认证配置 前言:基于Mosquitto服务器已经搭建成功,大部分都是采用默认的是允许匿名用户登录模式,正式上线的系统需要进行用户认证. 1.用户参数说明 Mosquitto服务器 ...
- sqlserver连接问题收集
问题1. 使用navicat连接本地sqlserver,报错“命名管道提供程序无法打开与 sql server 的连接 [2]” 解决: 参考本篇文章 <持续收集中>
- Spring Mvc 页面传递数组到后台接收
1.定义一个简单的类 User.java public class User { private Integer id; private String name; public Integer get ...
- hive异常:创建MySQL时Specified key was too long; max key length is 1000 bytes
2015-11-13 14:44:44,681 ERROR [main]: DataNucleus.Datastore (Log4JLogger.java:error(115)) - An excep ...
- PHP 二叉树 二叉排序树实现
<?php /** * PHP 二叉树 * @author : xiaojiang 2014-01-01 * */ class Tree { protected $k = null; prote ...
- 重新签名IOS .ipa文件 (包含第三方框架和插件)
本文未经测试,初步看代码流程接近本人想法,留下作记录.Intoduction This code allow you to resign your own ipa assuming that you ...
- 【JVM译文】JVM问题定位前的准备工作有哪些
一.序 最近在学习jvm工具时,不少链接直指oracle官网.才发现有不少好东西. 本文翻译自: https://docs.oracle.com/javase/8/docs/technotes/gui ...
- C# IO流的操作(一)
C# IO流的操作非常重要,我们读写文件都会使用到这个技术,这里先演示一个文件内容复制的例子,简要说明C#中的IO操作. namespace ConsoleApplication1 { class P ...