1、产生背景
我们先思考三个问题,有助于我们去理解为什么会产生 雪花算法
问题一:在Mysql分布式框架中,为什么不使用自增主键
问题二:为啥不用UUID做主键,会存在什么问题?
下面将会一一的去解释这些问题
(1)在Mysql分布式框架中,为什么不使用自增主键
首先,即使是做分布式,将数据库做水平分库分表,我们都要保证一个非常非常重要的一点,在不同分库,不同分表中,不能够出现相同的主键,否则的话会出先数据的歧义,那么如果用自增主键的话,首先我们需要保证一点,在不同的分库分表中,依旧需要去保证这个自增主键的唯一性,怎么解决呢?我们只能去规定某一个节点去存储0-5000,然后某一个节点去存储5001-10000,如果是这样的话,不同的节点内的这个自增主键是一定不会冲突的,但是有一点,很笨重,不易去做拓展,凭什么我这个节点就只能存储5000个?第二点,当我录入前5000个时,只会去访问某一个节点,那么去插入数据,这段时间只会往这一个节点去录入,这就违背了负载均衡。
(2)为什么不用UUID去做主键
第一点,UUID太长啦,存储的话不方便
第二点,主键在Innodb的存储引擎下,主键是一定有一个聚簇索引的,UUID是无序的,创建B+树时会因为UUID的无序导致频繁的分裂,很耗费时间
2、雪花算法是基于什么原理实现的
本质上,雪花算法最后的结果是一个64bit长度的long类型的数字,其中第一位为标志位,表示是否可用,然后的41位表示时间戳,unix的时间戳,最长可以表示69年,然后后面的位数可以表示机器号与序列号,然后就可以保证雪花的唯一性。