当前位置: 首页 > 科技观察

数据库分库分表后,如何解决这个问题呢?

时间:2023-03-18 10:58:19 科技观察

在此之前,我们介绍了分库和表分库的问题。分库分表可以给我们带来很好的扩展性和性能提升,但是也带来了一些问题,比如数据ID的主键分配问题。我们以Mysql为例。通常我们使用数据库的自增主键。我们在分表的时候,也是尽量保证业务不需要跨表查询数据,但是难免会遇到这样的场景。这时候,我们就会面临这样一个问题,如果两张表上的主键ID重复,那么业务就会出问题,带来不可估量的后果。那么我们如何解决主键的唯一性问题呢?下面我们介绍几种常用的方法,以及它们的优缺点。方法一首先,我们可以使用随机的方法来生成主键。通常,只要随机算法合理,适当加盐,生成的64位主键ID重复概率极低(几乎不需要考虑碰撞)。这种方法的优点是:实现起来很简单,但是有什么问题呢?首先,身份证的长度会很长。我们都知道在数据库中,主键ID过长会降低索引的性能。其次,随机生成的主键ID是乱序的,也就是说在插入新数据的时候,需要插入索引。我们都知道Mysql的索引是B+树。如果B+树一直插入无序数据,性能会大大降低,结果就是插入性能下降。聪明的同学可能已经想到,我们也可以生成有序的随机数。比如使用Twitter的SnowFlake可以在一定程度上避免B+树插入的影响。方法二在方法二中,我们仍然可以利用数据库的主键自增特性。在Mysql数据库中,可以设置主键递增的步长,即我们不需要按1、2、3递增。如果我们将步长设置为10,从10开始,则将是10、20、30。如果我们划分10张表,那么我们可以让每张表从0开始到9,然后设置步长为10,这样十张表中的数据就不会重复了。这种方式的好处也很简单,只需要简单的配置,那么它有什么问题呢?首先,扩展起来很不方便。如果我们想把分表从10个改成20个怎么办?会给我们带来一定的麻烦。方法三在第三种方法中,我们可以维护一个ID分配器。我们可以使用Redis等相关组件将预先分配好的ID放入Redis队列中。取出一个元素,然后将其插入数据库。当然,这种方式需要一定的开发,并且可以相对保证主键id的顺序,扩展也比较简单。总结那么哪种方法更好呢?在计算机编程中,没有绝对的好或绝对的区别。只要能贴近业务,保证系统的顺畅运行,并且不需要很大的开发和维护成本,就是一个很好的方法,需要根据自己的业务和目前的开发运维经验来选择.欢迎大家关注我,一起学习,一起进步。您的支持是我继续聊天的动力。

猜你喜欢