標籤: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是根據下面的演算法推導:
發現大於2的數我們稱這種價值V下的力量;它可以計算為:
V = POWER(2, CEILING(LOG(2, num)))
(假設數字為13)。然後LOG(2,13)是3.7004397181411。CEILING(3.7004397181411)是4,和V =功率(2,4),這是16。)
- N = F(column_list) & (V - 1).
N >= num:
- Set V = V / 2
- Set N = N & (V - 1)
線上性雜湊分割的好處是增加,下降,合并,拆分分區可以更快,有利於在處理含有非常大量的資料表(百萬MB)。缺點是,與常規雜湊分割獲得的分布相比,分區之間不太可能均勻分布資料.
Mysql 分區介紹(六) —— HASH分區