MySQL系列:10 分區--分區類型篇

開門見山

         通俗而言,分區即將某個表(通常都是大表)分爲幾個部分,一般商用數據庫均支持分區,用於突破OS對文件大小的限制,也爲了加速對大表的查詢。如Oracle分區表可以將表的不同部分存儲到不同的表空間。同樣,MySQL因默認開啓innodb_file_per_table選項,其每張表對應一個數據文件(即爲表空間),因而MySQL的分區也是表的不同部分存儲到不同數據文件(表空間)中。

         MySQL分區又稱水平分區,即水平的將錶行數據劃分到不同子集,不同子集的劃分取決於分區函數。MySQL支持四種分區類型,分別爲:RANGE、LIST、HAS、KEY,不同分區類型還支持不同的變體。下面將詳細描述此四種分區,並給出相關建表語法示例。

range分區

         range分區使用連續而而不重疊的範圍對錶進行分區。如序號1~1000、1001~2000、2001~maxvalue等;

建表語句

create table range_par1 (id int(11) not null) partition by range(id) (partition pt1000 values less than (1000) );

 

    如上SQL語句創建表range_par1通過range劃分ID小於1000的行到pt1000分區。當向表中插入ID爲1001的記錄時,報找不到分區錯誤。

變體columns

         range分區支持column變體,可以對多個列進行分區。如:

mysql> create table range_col_par1 (id int(11) not null, id2 int(11) not null) partition by range columns(id,id2) (partition pt1000 values less than (1000,1000) );

Query OK, 0 rows affected (0.55 sec)

list分區(離散型)

         與range分區類似,list也是通過列的範圍進行分區,只不過list分區需要自行指定範圍,也即成爲一種離散型分區。

建表語句

create table list_par1 (id int(11) not null) partition by list(id) (partition p0 values in (1,3));

 

如上,id值爲1或3的記錄爲p0分區。插入ID爲2的記錄報找不到分區錯誤;

變體columns

同樣,list分區支持columns變體,可用於對一個或多個列進行分區劃分,如下:

 

hash分區

         與上述range和list分區不同,hash分區通過對指定列進行HASH運算,可使相關行記錄均衡的分佈到各個分區。

建表語句

create table hash_par1 (id int(3) not null) partition by hash(id) partitions 4;

 

    如上,創建了hash分區表hash_part1,以ID列作爲hash變量分爲四個分區,插入0~9十行數據庫,通過information_schema元數據表查看行分佈,可知p0/p1分區分佈3行,p2/p3分區分佈2行。

變體LINEAR

    HASH分區支持linear變體,即線性hash分區,其與常規hash不同的是,linear hash採用線性power-of-two算法計算hash key。有關power-of-two算法筆者將酌情在後續算法專題論述,創建liner hash分區表語句如下(在hash關鍵詞前面假設linear):

 create table hash_linear_par1 (id int(3) not null) partition by linear hash(id) partitions 4;

key分區

         key分區與hash分區類似,不過HASH分區只支持整數,KEY分區支持除BLOB ,Text類型外的其他類型作爲分區鍵。

建表語句

create table key_par1 (name varchar(11)) partition by key(name) partitions 4;

變體LINEAR

    key分區的linear變體與hash分區類似-此處從略;

子分區

         RANGE和LIST類型的表可以進一步進行子分區。子分區類似可以爲hash 或 key。如下:

建表語句

CREATE TABLE sub_test (id INT, id2 INT)
PARTITION BY RANGE( id )
SUBPARTITION BY HASH( id2 )
SUBPARTITIONS 2 (
   PARTITION p0 VALUES LESS THAN (1990),
   PARTITION p1 VALUES LESS THAN (2000),
   PARTITION p2 VALUES LESS THAN MAXVALUE
    );

         如上,首先通過id進行range分區爲3個分區,之後同id2列對分區再進行子hash分區,這樣,整個表就形成六個分區。

總結

         如上所述,MySQL支持range、list、hash、key四種分區類型,每種分區類型又支持不同的變體,其中range、list分區還支持子分區,可謂及其靈活。

總體而言,分區的意義在於人爲將表劃分爲幾個部分,用於分散表的存儲,加快大表的查詢,這對錶記錄特別多時非常又用。下面列出以上測試語句創建表後所形成的表空間文件,即每個分區一個文件。後續博文將繼續分許分區表操作,包括指定不同分區位於不同路徑(用於降低磁盤故障風險),對錶分區進行修改/合併等。

謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章