flickr 的全局主键生成方案
来源:互联网 发布:mac幼圆字体下载 编辑:程序博客网 时间:2024/06/06 17:27
flickr 的全局主键生成方案
类似于京东的数据库设计,我们的用户分库有 Shop_1/2/3/4 … 那么uid怎样生成?
现在的做法是在用一张索引表 Shop_share.user_index 取其自增主键,insert_id 便是uid。但缺点是,有单点负载的风险。
flickr提供了一个扩展的更好的方案: 他们把 user_index 抽出一个专门用作生成 uid 的表,例如取名叫 uid_sequence,并拆成若干的字表,自增步长设置为2(机器数目),这两张表可以放在不同的物理机器上。 其中一个表负责生成奇数uid,另一个负责生成偶数uid
uid_sequence 表的设计
比如创建64位的自增id:
CREATE TABLE `uid_sequence` ( `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 uid_sequence 输出:
+-------------------+------+ | id | stub | +-------------------+------+ | 72157623227190423 | a |
如果我需要一个全局的唯一的64位uid,则执行:
REPLACE INTO uid_sequence (stub) VALUES ('a'); SELECT LAST_INSERT_ID();
- 用 REPLACE INTO 代替 INSERT INTO 的好处是避免表行数太大,还要另外定期清理。
- stub 字段要设为唯一索引,这个 sequence 表只有一条纪录,但也可以同时为多张表生成全局主键,例如 user_ship_id。除非你需要表的主键是连续的,那么就另建一个 user_ship_id_sequence 表。
- 经过实际对比测试,使用 MyISAM 比 Innodb 有更高的性能。
这里flickr使用两台数据库作为自增序列生成,通过这两台机器做主备和负载均衡。
TicketServer1: auto-increment-increment = 2 auto-increment-offset = 1 TicketServer2:auto-increment-increment = 2 auto-increment-offset = 2
MySQL 中 last_insert_id() 的并发问题
因为是两条SQL语句,所以这两条语句之间会不会有并发问题?
答案是不会,因为 last_insert_id() 是 Connection 级别的,是单个连接客户端里执行的insert语句最近一条,客户端之间是不会影响,没必要锁定和事务处理。
阅读全文
0 0
- flickr 的全局主键生成方案
- flickr 的全局主键生成方案
- flickr 的全局主键生成方案
- flickr的全局主键生成方案
- flickr 的全局主键生成方案
- 使用Replace into 生成全局唯一主键(flickr)
- flickr 对于分布式系统生成全局唯一ID的解决方案
- 基于mysql的全局ID生成方案
- 分库分表全局主键生成策略
- vue的全局主键
- 全局唯一ID生成方案
- flickr的分表全局唯一id实现方式
- Ticket 服务: 一种经济的分布式唯一主键生成方案
- 分布式环境下全局唯一ID的生成方案
- 各种全局主键生成策略对比
- 各种全局主键生成策略对比
- 数据库分库分表(sharding)---全局主键生成策略
- 唯一主键生成方案学习笔记
- PHP判断是否为AJAX请求
- ACMer?不存在的QwQ
- hdu 5495 置换
- Java基础知识-7、字符串
- jq_example
- flickr 的全局主键生成方案
- 2017ICPC北京 J:Pangu and Stones(区间DP)
- 为二维vector进行赋值
- 十八、<2015小米暑期实习笔试题>懂二进制
- 设计模式最简Demo:简单工厂模式[Simple Factory Pattern]
- Java多线程面试问题
- CCF 201703-2 学生排队 Java
- 利用Volume在主机和Docker容器文件传输。
- C++单链表面试题