MySQL分布式主键(学习记录)

71 阅读2分钟

问题

1、在MySQL的分布式环境中,为什么不推荐使用自增主键?

分布式数据库,我分几种场景进行描述

(1)按照数据的分布范围来进行分布存储 例如 A库存1-300 B库存301-600 C库存601-900...

此时数据库使用自增主键没有问题,但是代表着A库没存满时,B库和C库等是不会进行数据存储。代表着某一个时间段中,数据库压力并没有做到负载均衡,不符合分布式的思想。

(2)全局维护一套自增主键

当A库使用了自增主键1后,需要将数据实时同步到其他库中,此时是非常损耗性能的,因为同步的过程是需要加锁的

(3)每个数据库维护一套自己的自增主键

会产生数据冲突

2、UUID可以用来做主键吗?有什么问题?

UUID是一个碰撞的风险非常低的值,所以它是完全可以用来做主键的,但是它会导致数据库的插入性能差。

MySQL的索引存储结构是B+树

B+树的特点是

(1)所有的数据都会出现在叶子节点。

(2)叶子节点形成一个单向链表。

(3)非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的。

(4)MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序。

微信图片_20250209151913.png 原文链接:blog.csdn.net/m0_53222084…

因为B+树叶子节点是有序的,当在某个页中间插入数据,会导致B+树的分裂

3、雪花算法可以用做主键吗?原理是怎么样的?有什么优缺点

什么是雪花算法?

微信截图_20250209152610.png

雪花算法是一个64位的长整型,首位无义,41位时间戳,10位机器码(包括5位机器id,5位服务id,以及12位的序号)

雪花算法是可以生产全局唯一的ID,同时可以看出,雪花算法是一个与时间戳高度依赖的,则保证了它是趋势递增的。