mysql全局唯一ID生成方案(一)

随着数据库分片,全局唯一ID的生成变得复杂。本文介绍了几种策略:UUID因性能问题不理想;Sequence表易成性能瓶颈且存在单点故障;Flickr的双表奇偶策略解决了部分问题;Redis的原子操作提供了高并发解决方案。每种方案都有其优缺点,需根据场景选择。
摘要由CSDN通过智能技术生成

一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键生成机制。一方面,某个分区数据库自生成的ID无法保证在全局上是唯一的;另一方面,应用程序在插入数据之前需要先获得ID,以便进行SQL路由。


目前几种可行的主键生成策略有:

1. UUID:使用UUID作主键是最简单的方案,但是缺点也是非常明显的。由于UUID非常的长,除占用大量存储空间外,最主要的问题是在索引上,在建立索引和基于索引进行查询时都存在性能问题。(UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。)

2. 结合数据库维护一个Sequence表:此方案的思路也很简单,在数据库中建立一个Sequence表,表的结构类似于:

     CREATE  TABLE  ` SEQUENCE ` (  
         `tablename`  varchar (30)  NOT  NULL ,  
         `nextid`  bigint (20)  NOT  NULL ,  
         PRIMARY  KEY  (`tablename`)  
     ) ENGINE=InnoDB


每当需要为某个表的新纪录生成ID时就从Sequence表中取出对应表的nextid,并将nextid的值加1后更新到数据库中以备下次使用。此方案也较简单,但缺点同样明显

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值