Mysql 分區介紹(六) —— HASH分區
阿新 • • 發佈:2018-03-30
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)
在線性哈希分區的好處是增加,下降,合並,拆分分區可以更快,有利於在處理含有非常大量的數據表(百萬兆字節)。缺點是,與常規哈希分區獲得的分布相比,分區之間不太可能均勻分布數據.
Mysql 分區介紹(六) —— HASH分區