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语句最近一条,客户端之间是不会影响,没必要锁定和事务处理。

flickr 的全局主键生成方案相关推荐

  1. Ticket 服务: 一种经济的分布式唯一主键生成方案

    2019独角兽企业重金招聘Python工程师标准>>> MySQL分库分表早已经不是什么新鲜话题了.甚至已经成了说到MySQL就会说到的话题.在一张表中,MySQL提供了原生的自增主 ...

  2. [MyBatisPlus]常用注解_@TableName_@TableId_@TableField_@TableLogic通过全局配置配置主键生成策略

    常用注解 @TableName 设置实体类所对应的表名 如果全部表都有某个前缀,难道我们要通过一个一个加注解的方式来解决实体类对应表名问题吗? 我们可以通过配置文件来解决这个问题: @TableId ...

  3. 分布式主键生成设计策略

    1 写作目的 这几天被虾皮裁员的消息刷屏了,实话实说互联网的行情确实很差,各处都在裁员.而且最近在忙试用期转正答辩,还不错,光荣的成为了一个大厂的正式员工,很庆幸在这么不稳定的情况下还能有自己的一寸方 ...

  4. Hibernate持久化类与主键生成策略

    Hibernate持久化类 什么是持久化类? Persistent Object (PO) PO=POJO+hbm映射配置 对于hibernate中的PO编写规则: 1. 必须提供一个无参数的publ ...

  5. mybatis主键生成策略和mp主键生成策略

    mybatis主键生成策略和mp主键生成策略 1,mybatis plus 主键生成策略 都是通过给实体类的属性添加注解的方式执行type = IDTYPE- ​ 1,AUTO数据库ID自增 ​ 2, ...

  6. (转) Hibernate持久化类与主键生成策略

    http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...

  7. 雪花算法及分布式主键生成策略详解

    目前雪花算法常应用于分布式环境下作为分布式主键的首选,本文详细介绍下雪花算法及相关分布式主键的生成策略. 如下内容已本文PPT讲解内容为基础. 本次内容共包括4部分:分布式主键生成策略,雪花算法详解, ...

  8. Mybatis-Plus主键生成策略详解

    文章目录 前言 一.官网 二.主键注解@TableId说明 1.源码 2.作用 3.使用 三.主键生成策略-IdType枚举说明 1.源码 2.说明 3.全局设置 三.ID生成器介绍 1.Identi ...

  9. MyBatisPlus主键生成策略

    简介 我们可以通过 @TableId 注解的 type 属性来设置主键 id 的增长策略,一共有如下几种主键策略,可根据情况自由配置. AUTO(数据库 ID 自增) 对于像 MySQL 这样的支持主 ...

最新文章

  1. mysql数据库建仓范式_存mysql个数
  2. 刚刚,《The Scientist》预测了未来最热门的生命科学技术
  3. Delphi匿名方法(三):扩展本地变量的生命周期
  4. boost::gregorian模块实现计算今年的元旦直到下一个元旦的日子的测试程序
  5. mysql 多表查询 优化_Mysql 多表联合查询效率分析及优化
  6. linux es数据库 head,elasticsearch安装es-sql插件
  7. 【MySQL】性能优化之 Index Condition Pushdown
  8. vim 查找匹配字符串次数
  9. 用create table 命令建立表
  10. linux提示qq不是最终版本,Deepin中QQ出现当前版本存在安全风险,将于2019年10月30日停止使用的解决...
  11. 安卓编程用什么软件_手机上能安装PLC编程软件吗?为什么?
  12. 三阶实对称矩阵的秩一分解(快速计算三阶矩阵特征值特征向量的方法)
  13. ActiveX控件使用总结
  14. 平均值绝对偏差最大c语言,请教平均值和最大偏差值得使用
  15. MATLAB之LU分解法(十)
  16. 使用Python 去除kg视频水印代码
  17. 【宋代文学】之《青玉案·元夕》
  18. 推理悬疑侦探小说大全合集隐私政策
  19. java smb删除指定文件,java 利用SMB向远道机器写文件
  20. 雷柏M300G使用体验

热门文章

  1. 海信电视出现信息服务器,电视机一直显示启动中是什么原因_海信电视一直系统启动...
  2. 陌陌突然改名Hello,能撕掉固有标签吗?
  3. 一文读懂服务式办公室、共享办公室、联合办公空间、开放式工位的关系
  4. 微信小程序JavaScript判断值是否为空工具类方法
  5. 微信小程序获取数据库的数据返回空数组
  6. Redis 之布隆过滤器,增强版,布谷鸟过滤器
  7. 相信中国杂交水稻技术 国稻种芯:中菲农业创繁荣发展时代
  8. PTA 2021C语言程序设计专题实验02-循环
  9. 软件测试需求管理系统,软件测试管理及工具应用
  10. 热电阻pt100 CU50隔离转换器转4-20ma模拟量输出温度变送器0-10V