persons 表:

idnameemailcityaddress
1Johnjohn@gmail.comLondonOxford Street
2Georgegeorge@gmail.comNew YorkFifth Avenue
3Thomasthomas@163.comBeijingChangan Street

这张表是为下面举例而存在的,举的例子可能并不是特别恰当,不过这里重点是介绍分割方法。

01. 水平分割

水平的意思就是横着分割,那么横着的是 ,即数据记录。那什么情况下需要对记录分割呢?当然是数据量很大的情况咯。

这种分割方法依据条件一般有:日期时间 国家地区 等。更多条件根据不同应用场景而不同。

比如在上面的 persons 表中,可以根据每个人的 city (城市) 来分配不同表。或者通过 id 呢?

缺点:

如果是通过 city 分割的,那么我要得到 city=Beijing and city=London 的 所有的数据,怎么得到?没法一下得到! 因为不同城市搞到了不同的表里面,所以你至少需要查询 2 张表。最后把两张表的数据 union 起来。

02. 垂直分割

垂直的意思是竖着。这里竖着指的是 ,即每个字段。所以意思就是说把不同字段放到不同表里面。

比如我这是一个会员系统,在这个系统中,要经常取到的是 id name email 这三个字段。而余下的 city (城市) address (地址) 则不常去取,所以我完全可以把它搞到其他表里,如果需要的时候再去 join 一下。

缺点:

比如现在我把 id name email 三个字段放到 persons 表里,而 city address 字段放到 persons_info 表,具体怎么去 join 呢?你怎么知道 personspersons_info 表的对照关系呢?所以还得在 persons_info 里搞个字段,这个字段的意义就是用来记录与 persons 的对应关系。那现在应该很清楚缺点是什么了吧?多了个字段啊!!

03. 散列分割

说到散列,就能立刻想到 hash 这个词。散列分割 与 水平分割 其实是差不多的。

比如还是说我要通过 city 这个字段分割数据,但是这次我是想把数据随机分配到 100 张表中。在这时候就肯定要用 hash 算法 了吧。如果不用,那么地球上的城市非常多,你怎么把所有的数据都搞到 100 张表里去?而且还得随机。