MySQL分區介紹
MySQL的分區技術不同與之前的分表技術,它與水平分表有點類似,但是它是在邏輯層進行的水平分表,對與應用程序而言它還是一張表。
2.1 MySQL分區類型
MySQL5.1有5中分區類型:
RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區;
LIST 分區:類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇;
HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL 中有效的、產生非負整數值的任何表達式。
KEY 分區:類似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL 服務器提供其自身的哈希函數。
2.2 RANGE分區
對於RANGE分區,舉個例子:
例1. 假定你創建了一個如下的一個表,該表保存有20家音像店的職員記錄,這20家音像店的編號從1到20。 如果你想將其分成4個小分區,那麼你可以採用RANGE分區,創建的數據庫表如下:
這個例子,它的key是一個整型的數據,那是否對於其它類型的字段就無法作爲key呢? 答案是否定的,例子2說明這種情況。
例2. 假定你創建了一個如下的一個表,該表保存有20家音像店的職員記錄,這20家音像店的編號從1到20。你想把不同時期離職的員工進行分別存儲,那麼你可以將日期字段separated(即離職時間)作爲一個key,創建的SQL語句如下:
這樣你就可以對一個日期類型的字段調用mysql的日期函數YEAR()轉換爲一種整數類型,從而可以作爲RANGE分區的key。這個時候,你可以看到,按照分區後的物理文件是相對獨立的:
可知,每個分區有自己獨立的數據文件和索引文件,這是爲什麼你對某一個查詢,它只會訪問它需要訪問的數據塊,而不訪問根本不是結果的物理塊,從而可以大大提高系統的效率。
2.3 LIST分區
LIST分區與RANGE分區有類似的地方,舉個與例1類似的例子如下:
例3. 假定你創建了一個如下的一個表,該表保存有20家音像店的職員記錄,這20家音像店的編號從1到20。 而這20個音像店,分佈在4個有經銷權的地區,如下表所示:
地區 商店ID 號
北區 3, 5, 6, 9, 17
東區 1, 2, 10, 11, 19, 20
西區 4, 12, 13, 14, 18
中心區 7, 8, 15, 16
那麼你可以採用如下的LIST分區語句創建數據表:
同樣,它在物理文件上也會標識不同的分區:
2.4 HASH分區
HASH分區主要用來確保數據在預先確定數目的分區中平均分佈。它可以基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。
例4. 假定你創建了一個如下的一個表,該表保存有20家音像店的職員記錄,這20家音像店的編號從1到20。你想把不同時期加入的員工進行分別存儲,那麼你可以將日期字段hired(即離職時間)作爲一個key,創建的SQL語句如下:
那麼要插入一個‘2005-09-15’入職的員工E1,那麼按照取模函數會將其放置到第2分區中:
MOD(YEAR(‘2005-09-01’), 4)= MOD(2005,4)= 1 //即第2分區