00:00
我们来看一下这个水平分表,它的业务复杂性体现在哪?就是ID这。大家想一想,假设说。我呢,嗯,分了三张表。我我这有三张表啊。都是user表user。UR。USER3,你有没有考虑过你这个数据怎么去做?比如说我一开始就有三张表。那我数据怎么去录入,我是。ID为一的用户,比如说或者说我第一个用户吧,我插到这张表里。第二个用户我插到这张表里,第三个用户我插到这张表里,那么他们的ID怎么分配?对吧,因为每一个表它的这个主键策略呢,实际上相对来说是独立的。啊,尤其是针对我们的买SQL数据库,它表和表之间呢,不能跨表做策略,好,那么可能这张表呢,它是一个逐件自增的策略,那如果主键自增的策略的话呢,你往这张表中插数据,它的ID是一,好你往这张表中插数据,它ID还是一,你往这张表中插出他的IID还是一,对不对,这是不是主键冲突了。
01:11
这个方案不行,那么呢,我们来看一下,我们能不能这样去查。就是我呢?把它清空一下啊,重来画。另外一种方案。好,另外一种方案是什么方案呢?就是。我先往这个表里查。这表里呢,ID是一,然后再插一条记录,ID是二,再插一条记录ID是三。插满了之后一共5000万条啊,ID是5000。好,往这里查,往这里插,你要怎么做?首先你往这里插的时候,你先要上这个表里查一下最大值已经是多少了,发现是5000万,然后你再在这查5000。
02:00
零。001万我就省略了啊,五千零一五千万零一,然后你再查50000002,好,这个有一个问题,什么问题呢?这两个数据库非常不均衡。我们不说做负载均衡吗?你再做负载均衡,你要是分到不同的这个服务器上面的话,我要查ID唯一的用户,那我一定是要上这个服务器来查的,对不对?好,那么这个服务器会面临非常大的访问压力,这个服务器基本上没事干,可能偶尔访问一下他,因为最开始呢,他肯定会有一个逐渐增多的过程嘛,数据,那么在他数据量非常小的时候呢,这两边的这个访问压力呢,就不均衡。对吧,所以说呢,这是这样的一个问题啊,好,然后但是这种数据库分表的方式也有一个优点,它的优点是什么呀,就动态扩展啊,当我5000万以内的数据的时候,我不用买这两台服务器,我什么时候快达到5000万了,诶我再把这个服务器配置上。
03:00
好,我快达到1亿了,诶我再把这个服务器配置上,所以这种方式呢,就是扩展非常灵活。但是呢,会造成我们服务器的这个访问不均衡的一个现象,对吧,嗯,好。那么访问不均衡,这个时候,哎,我们又想。一开始我们的第一种方案好,好像挺均衡的是吧,你看第一种方案。先来三台服务器。啊,这里面插一条。这里面插一条,这里面插一条,下一条记录呢,又往这里插,这里又插一条。啊,然后这里又差一条。这里又差一条,这是不是均衡了三台服务器,每台服务器都有两条用户数据,那么按照概率来说的话呢,他们访问应该是。均衡的,但是这有一个问题,就刚才我们说到的,你这策略怎么设置111就不太合适,呃,聪明的同学马上就会想到我123呀,因为我设置主键策略的时候,我可以设置起止嘛,啊,我比如说它的起止数字呢,就是一,它的起止数字呢就是二,它的起止数字呢就是三,这样的话一二三都。
04:13
占用了之后,那么它的下一个数字呢,就是四,所以它的步长就是几啊,步长是三。对吧?好,那么它的下一个数字是五,所以它的步长也是几啊,步长也是三好,它的下一个数字是六,它的步长是几三好,那这样的话呢,我们就知道了,我们的ID策略就比较好定义了,因为这种策略是非常可以方便的在我们的数据库当中设置的,包括在业务层当中都可以实现,那么我们就定义每一个数据库的起始的ID是123,然后不长是333就可以了,好均衡了。但是他有一个问题,扩展不方便。为什么你比如说我们的目标呢,是每一个数据库能存1000万的数据,这个时候一共存3000万的用户啊好,现在呢。
05:02
你的业务规模扩大了,用户量呢?增加了你有。比3000万还多的用户了,那大家想。这个表怎么办?这个表怎么办?你这个表的数据记录,你就没办法处理了,你说我从四开始。那不行。四已经被谁占了?被他占了对不对,从五开始六都不行,你从任何一个数字开始都不行,因为所有的这些数字,无论是过去、现在和将来,都会被前面三台服务器,要么就是已经占用了,要么就是将会被占用,所以你哪个你也用不了。这个时候就会面临数据迁移的问题啊,就会面临数据迁移的问题,所以说用这种策略的话呢,就会有一个什么问题呀,第一扩展不方便,第二你硬要扩展的话,你要做数据迁移,你把之前已经存在这里面的这些数据呢,硬性的迁移到。别的。
06:01
这样的一个。地方去或者说硬性的迁移到,或者是说重新分配吧,对不对啊,把这个数据重新进行分配,所以这个非常麻烦啊,所以这个就是我们所说的这样的这种组件的策略,那么这种问题呢,出现在我们分布式项目当中,就是我们在做分表的时候,而且是水平分表的时候,好那么有没有什么解决方案呢?肯定是有的呀,对吧,我们下堂课再来说啊,这堂课呢,我们先了解一下它的呃,复杂度的来源啊,然后呢,大家去学会去分析它的复杂度有什么优点,以及有什么缺点,以及基于这样的一些优点和缺点,我们怎么样去找一个鱼和熊掌可以兼得的一个解决方案。
我来说两句