1. 程式人生 > >Mysql 分區介紹(六) —— HASH分區

Mysql 分區介紹(六) —— HASH分區

mysql分區 hash分區 數據庫分區

hash分區是使用主鍵去確保數據均勻分布在一個預先確定數字的分區上. 在range 或list分區中. 你必須顯式的指定給出的數據寫入哪個分區或設置一個列值去保存; 在hash分區中. Mysql已經為你準備的. 你只需要指定一個列的值或表達式基於列值去hash和分區的數字在哪個分區表中.

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 HASH(store_id)
PARTITIONS 4;

如果不包含PARTITIONS, 那麽默認為1個分區

使用日期分區

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 HASH( YEAR(hired) )
PARTITIONS 4;

expr 必須是非恒量的數, 非隨機的數, 就是數字是不同的, 但是是可以確定的。

如何確定一條數據的分區呢?先創建一個表

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

如果你插入一條記錄到T1的col3值為“2005-09-15 ‘,然後分配其存儲決定如下:

MOD(YEAR(‘2005-09-01‘),4)
=  MOD(2005,4)
=  1

1. 線性hash分區

線性hash分區使用一個線性的2的冪運算法則

REATE 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在Num的分區,其中n是根據下面的算法推導:

  1. 發現大於2的數我們稱這種價值V下的力量;它可以計算為:

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

    (假設數字為13)。然後LOG(2,13)是3.7004397181411。CEILING(3.7004397181411)是4,和V =功率(2,4),這是16。)

  2. N = F(column_list) & (V - 1).
  3. N >= num:

  4. Set V = V / 2
  5. Set N = N & (V - 1)

在線性哈希分區的好處是增加,下降,合並,拆分分區可以更快,有利於在處理含有非常大量的數據表(百萬兆字節)。缺點是,與常規哈希分區獲得的分布相比,分區之間不太可能均勻分布數據.

Mysql 分區介紹(六) —— HASH分區