00:00
前面我们进行了水平分库的测试,那么接下来呢,我们来进行一个水平分表的测试,我们打开文档看一下这个里面的。数据分片的一个说明,那这面呢是分策略。这呢就是分表策略了,那么分表策略这一块呢,它是同分库策略的,所以说呢,分表策略它实际上就写了这一行,但是实际上所有的内容呢,和前面呢。是一样的,不是database改成了啊,所以除这个database换成之呢,他是和分库策略呢是一样的,所以呢,我们来看一下这个怎么去配置。那么既然是一样的,我们就把分策略这个呢复制一下。然后在这个地方呢,改成分表策略。好。然后这个位置呢,我们给它改成table,像这块一样。
01:02
比较table哈。这个就是分表策略,分表策略就是在一个数据源当中,如果有多张表的话,那么呢,我们会根据这个策略把数据呢,分配到这些不同的表当中。那么我们还是根据t order表进行配置,我们这一次呢,打算根据另外一个字段呢来进行策略的配置,那么我们来看一下order,这里面我们还有一个字段呢,叫order number,就是订单号,那我们呢,想根据订单号来进行策略的配置,比如说。在我们的数据库当中,我们以ORDER0这个数据库为例,如果订单号是001的话,我们呢,就想把它放在这个叫做T1的这样的一个表当中,如果订单号是002的话,那么呢,我们就想把它放在T0这个表当中,那如果是。
02:01
003的话,我们就也放在ORDER1这个表中,那如果呢是004的话,我们还是把它放在二零这个表当中,所以它其实呢就是一个曲模策略,那么我们是不是可以这样写呢?L我们可以测试一不这个地方呢,我们就不能ID写。那么我们刚才是针对分表进行了一个策略的配置,所以上面的这个标准分片表配置,也就是数据节点配置这块呢,我们要把之前我们的这个表的节点给它还原回来,因为我们既想往T0中插数据,又想往T1中数据,所以呢,这块T0和T1呢必须同时存在了。那么现在呢,我们初步的配置呢,貌似配置完成了,我们来看一看针对order做曲分片的话可不可以好,我们在测试用例当中添加一个分表的插入测试。
03:15
然后这个地方呢,我们把它改成table好。那么我们插入数据的话呢,为了更清晰啊,测试的时候我们这I呢,就从这个100开始吧,然后到104,好,但是这个I我们并不是给I我给,那么我们就指定。好,ID是一的用户,然后呢的把这个I加到这块来,那我们从I开始计算就可以了,那所以呢,我们会插入一百一百零一,102 103这样的三条记录啊,作为我们的order number的值,那么我们现在呢来测试一下。
04:16
好,我们来看一下插入的结果,那你会发现呢,它报错了,为什么呢,其实这个错误呢,也显而易见,因为呢,我们这面的取模分片算法。是根据数值来取模的,那我们现在测试用例当中的这个订单号呢,它并不是一个数值,它是一个字符串的形式,对,所以我们直接对字符串进行曲运的话呢,实际上是不能成功啊,因为这个地方已经有很明确的错误了,说form exception字符串形式的这样的一个订单号来做曲模运算,那这面呢,就会有异常抛出来,好,那所以呢,我们怎么办呢?
05:00
那我们就来看一看还有没有什么其他可以用的分片算法,好,这面呢有一个哈西曲模分片算法,那么哈西曲模分片呢,实际上就是针对这一个列,先对它做哈希运算,然后呢根据哈希值来做曲模运算,这种分片算法呢,就特别适合我们这种字符串形式的字段,嗯,所以呢,我们先来做一个哈希取模的一个测试哈,Public。那么假设说我就是针对这样的一个字符串来进行还是运算,那就是100。点哈西。先把哈西打印出来吧,好,然后呢,我们分别打印100101102和。103,看一看他们的哈希都是什么?
06:14
好。这是他们计算出来的。哈西,那这个很明显是数值,既然是竖值的话呢,它不同于字符串,它就可以取模了。假设说我们还是对二进行驱魔。好,这个呢会自动落到奇数节点上,这个呢会自动的落到偶数节点上,因为这个叫做自动分算法啊,所以很多内容呢,比如说像这个。把负一转换成一的动作呢,这个自动分片算法呢,就帮助我们去做了,好,那接下来呢,我们就。
07:06
把这个分片算法呢,给它改一下,改成。哈希mod。我们找到分表策略,然后呢,在。这个地方呢,把分片算法改一下,当然了,这个分片算法呢,我们还没有具体的去创建,就在下面这块呢,我们来创建一下叫做哈希曲模分片算法,然后这个地方呢,我们给它改一个名字,比如说叫哈西mod。那这个地方呢,我们就把刚才的哈西mod给它复制过来。那现在呢,我们又有了一个分片算法,我们可以把这个分片算法呢,配置在。刚才的这个。确认一下分表策略这个位置。
08:00
好,那这样的话呢,根据order ID,我们可以做这样的一个分片。那接下来呢,我们再来做一个测试。好,这回测试呢就成功了,那么我们来看一下,因为我们插入的UID是一,所以呢它会被放在。这个数据中哈,因为我们在这个地方插入了不同的这样的一个单,那所以根据我们的分算法,我们看一看它会怎么样去插入刷新,那你会发现101和103这两个订单号的节点呢,会被插入到ORDER0表中,而ORDER1表中呢,插入的是100和102,那有的同学问,诶不对呀,我不是对二取模吗?那对二取模的话,为什么这个尾号是100的,这个数据没有插入到奥零表中呢?那整个算法呢,是对整个的字符串的哈希结果进行取模,你并不能简单的认为就是对这个后缀进行去模,明白吧?啊,因为我们算完哈希结果之后再去模,它不一定是零还是一了,就啊跟这个后缀是没有什么直接的关系的。
09:25
比如说我们再举一个例子,就是在这个地方啊,我们用零幺和零幺吧,这个如果单纯的是根据一和11去模,那么他们最后的结果肯定都等于一对不对,但是如果根据整个字符串的哈希来去模,我们来看一下。好,你会发现呢,虽然它的尾数都是一,但是呢,经过哈希,然后再取完膜之后的结果呢,一个是负一,一个是零,也就是说它取完模之后,它到底是零还是一,跟这个数是没有关系的啊,因为它是根据整个字符串呃的这个哈希结果来进行运算的,所以这个呢是需要大家注意的一点。
10:23
那么接下来呢,我们可以再做一个测试。做一个什么测试呢,就是把这个变成二。然后订单号呢,我们稍微做一个变化吧,好。好,现在呢也成功了,那么因为我们的user ID是二,那根据之前我们的分库配置,所以呢,这一组数据呢,将会被插入到。
11:02
这个数据库当中啊,那么我们来看一下。所以呢,在ORDER0这个数据库当中呢,插入了两条新的记录,然后呢,在ORDER1这个数据库当中呢,也插入了两条新的记录,那这个呢,就是我们当前的一个综合的例子,它既有水平分库又有水平分表,那么它会根据它最终。插到插插。
我来说两句