创建时间:

最后修改:


# 常见的几种数据分割方法

**persons 表:**

| id   | name   | email            | city     | address        |
| ---- | ------ | ---------------- | -------- | -------------- |
| 1    | John   | john@gmail.com   | London   | Oxford Street  |
| 2    | George | george@gmail.com | New York | Fifth Avenue   |
| 3    | Thomas | thomas@163.com   | Beijing  | Changan 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` 呢?你怎么知道 `persons` 和 `persons_info` 表的对照关系呢?所以还得在 `persons_info` 里搞个字段,这个字段的意义就是用来记录与 `persons` 的对应关系。那现在应该很清楚缺点是什么了吧?多了个字段啊!!



## 03. 散列分割 

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

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