利用Hash進行資料表Partitioning

作    者:吳修福 精誠資訊 恆逸教育訓練中心 資深講師
技術分類:資料庫

當資料表的資料量大到一定的程度後,必然會使該資料的存取效能下降,而且也有可能讓資料表檔案大小受到作業系統的限制,這個時候將資料表進行分割會是一個不錯的解決方案。

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 這個分割。

Share |
可在課程中了解更多技能…
相關學習資源︰
【SQL-4502】MySQL資料庫管理員