#### 24.2.4.1线性哈希分区

[](<>)[](<>)

MySQL还支持线性散列，这与常规散列的不同之处在于，线性散列使用两个算法的线性幂，而常规散列使用散列函数值的模。

在语法上，线性哈希分区和常规哈希之间的唯一区别是添加了`线性的`中的关键字`分割`子句，如下所示：

```
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LINEAR HASH( YEAR(hired) )
PARTITIONS 4;
```

表达*`expr`*，使用线性哈希时存储记录的分区是分区号*`N`*从中间*`号码`*分区，在哪里*`N`*根据以下算法得出：

1.  找到大于2的下一次幂*`号码`*.我们称之为*`五、`*; 它可以计算为：

    ```
    V = POWER(2, CEILING(LOG(2, num)))
    ```

    （假设*`号码`*她13岁。然后[`日志（2,13）`](mathematical-functions.html#function_log)是3.7004397181411。[`天花板（3.7004397181411）`](mathematical-functions.html#function_ceiling)是4，和*`五、`* = [`功率（2,4）`](mathematical-functions.html#function_power)，也就是16。）

2.  设置*`N`* = *`F`*(*`列列表`*) & (*`五、`* - 1).

3.  虽然*`N`* >= *`号码`*:

    -   设置*`五、`* = *`五、`* / 2

    -   设置*`N`* = *`N`* & (*`五、`* - 1)

    假设桌子`t1`，使用线性哈希分区，有6个分区，使用以下语句创建：


```
CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
    PARTITION BY LINEAR HASH( YEAR(col3) )
    PARTITIONS 6;
```

现在假设您想在其中插入两条记录`t1`拥有`可乐3`列值`'2003-04-14'`和`'1998-10-19'`.第一个分区的分区号确定如下：

```
V = POWER(2, CEILING( LOG(2,6) )) = 8
N = YEAR('2003-04-14') & (8 - 1)
   = 2003 & 7
   = 3

(3 >= 6 is FALSE: record stored in partition #3)
```

存储第二条记录的分区数计算如下：

```
V = 8
N = YEAR('1998-10-19') & (8 - 1)
  = 1998 & 7
  = 6

(6 >= 6 is TRUE: additional step required)

N = 6 & ((8 / 2) - 1)
  = 6 & 3
  = 2

(2 >= 6 is FALSE: record stored in partition #2)
```

使用线性散列进行分区的优点是，分区的添加、删除、合并和拆分速度要快得多，这在处理包含大量（TB）数据的表时非常有用。缺点是，与使用常规哈希分区获得的分布相比，数据不太可能在分区之间均匀分布。
