當資料表的資料量大到一定的程度後,必然會使該資料的存取效能下降,而且也有可能讓資料表檔案大小受到作業系統的限制,這個時候將資料表進行分割會是一個不錯的解決方案。
MySQL提供四種分割方式:Range、List、Key及Hash,前兩種有明確的範圍,所以管理者可以很容易依據自己的需要來決定使用何種分割分式。Key及Hash主要是為了「平均」分散資料,除了Key是由MySQL所提供之內建函數來進行處理外,Hash就是管理者所必須要了解的了,否則也是會有可能發生資料不平均的情形。接下來我們就來看一下兩種狀況。
利用Hash分散資料
假設有個 table 定義及分割如下:
CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
PARTITION BY HASH( YEAR(col3) )
PARTITIONS 4;
這四個分割的名稱分別是 p0、p1、p2、p3。
接下來 insert 一筆資料到 t1,col3 的值假設是 '2013-09-15':
mod(year('2013-09-15'), 4)
= mod(2013, 4)
= 1
所以這筆資料會放在 p1 這個分割中。
利用Linear Hash分散資料
這個方式是利用 Power-of-Two 演算法分散資料,分配資料的公式如下:
V = POWER(2, CEILING(LOG(2, 分割數)))
N = F(新增資料) & (V - 1)
其中 F 是指系統內建的 Function。
N 指的就是將資料分配到的分割(pN)。
如果 N >= 分割數 則:
V = CEILING(V / 2)
N = N & (V - 1)
範例:
假設有個 table 定義及分割如下:
CREATE TABLE t2 (col int)
PARTITION BY LINEAR HASH(col)
PARTITIONS 6;
這六個分割的名稱分別是 p0、p1、p2、p3、p4、p5。
接下來新增 17 及 15 兩筆資料:
V = POWER(2, (CEILING(LOG(2, 6))) = 8
17 的部份:
N = 17 & (8 - 1)
= 1
1 沒有大於等於 6 (分割數),所以 17 這筆資料會放在 p1 這個分割。
15 的部份:
N = 15 & (8 - 1)
= 7
7 大於等於 6 (分割數),因此進行的步驟:
V = CEILING(8 / 2) = 4
N = 7 & (4 - 1)
= 3
因此 15 這筆資料會放在 p3 這個分割。
|