MySQL分库分表--全局ID生成方案
2016-04-12 17:57
633 查看
摘要: 介绍来自flicker和twitter的两种解决分布式环境下全局ID生成方案。
目录:
1. 数据库自增ID——来自Flicker的解决方案
2. 独立的应用程序——来自Twitter的解决方案
在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作。在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象。但是当我们对数据库进行了分库分表后,就不能依赖于每个表的自增ID来全局唯一标识这些数据了。因此,我们需要提供一个全局唯一的ID号生成策略来支持分库分表的环境。下面来介绍两种非常优秀的解决方案:
1. 数据库自增ID——来自Flicker的解决方案
因为MySQL本身支持auto_increment操作,很自然地,我们会想到借助这个特性来实现这个功能。Flicker在解决全局ID生成方案里就采用了MySQL自增长ID的机制(auto_increment + replace into + MyISAM)。一个生成64位ID方案具体就是这样的:
先创建单独的数据库(eg:ticket),然后创建一个表:
CREATE TABLE Tickets64 (
id bigint(20) unsigned NOT NULL auto_increment,
stub char(1) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY stub (stub)
) ENGINE=MyISAM
当我们插入记录后,执行SELECT * from Tickets64,查询结果就是这样的:
+-------------------+------+
| id | stub |
+-------------------+------+
| 72157623227190423 | a |
+-------------------+------+
在我们的应用端需要做下面这两个操作,在一个事务会话里提交:
REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
这样我们就能拿到不断增长且不重复的ID了。
2.略。
目录:
1. 数据库自增ID——来自Flicker的解决方案
2. 独立的应用程序——来自Twitter的解决方案
在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作。在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象。但是当我们对数据库进行了分库分表后,就不能依赖于每个表的自增ID来全局唯一标识这些数据了。因此,我们需要提供一个全局唯一的ID号生成策略来支持分库分表的环境。下面来介绍两种非常优秀的解决方案:
1. 数据库自增ID——来自Flicker的解决方案
因为MySQL本身支持auto_increment操作,很自然地,我们会想到借助这个特性来实现这个功能。Flicker在解决全局ID生成方案里就采用了MySQL自增长ID的机制(auto_increment + replace into + MyISAM)。一个生成64位ID方案具体就是这样的:
先创建单独的数据库(eg:ticket),然后创建一个表:
CREATE TABLE Tickets64 (
id bigint(20) unsigned NOT NULL auto_increment,
stub char(1) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY stub (stub)
) ENGINE=MyISAM
当我们插入记录后,执行SELECT * from Tickets64,查询结果就是这样的:
+-------------------+------+
| id | stub |
+-------------------+------+
| 72157623227190423 | a |
+-------------------+------+
在我们的应用端需要做下面这两个操作,在一个事务会话里提交:
REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
这样我们就能拿到不断增长且不重复的ID了。
2.略。
相关文章推荐
- mysql 修改字段值等于另一字段值或另一字段值的拼接
- MySQL 存储过程 递归 获取所有子节点
- MySQL基础四:表的删除、插入、更新、查找
- mysql事务的默认隔离级别
- MYSQL性能优化--不停机分表,修改mysql表结构
- MAC 环境下 初始化新的mysql root 密码
- Mysql 日志文件类型
- MySQL数据类型的验证
- MySQL可视化管理工具 —— Navicat for MysSQL
- 关于MySQL的select的一个特别现象
- Mysql用户授权
- 理解MySQL——索引与优化
- mysql中时间转换
- mysql5.7安装以及主从配置
- MySQL性能调优my.cnf详解
- MySql入门
- activeMQ Mysql静态话
- 在Node.js使用mysql模块时遇到的坑
- MySql中添加用户,新建数据库,用户授权,删除用户,修改密码
- mysql,命令导入\导出表结构或数据