MySQL分區表的管理~1
一、如何管理RANGE和LIST分區
以該分區表為例
CREATE TABLE members (
id INT,
fname VARCHAR(25),
lname VARCHAR(25),
dob DATE
)
PARTITION BY RANGE( YEAR(dob) ) (
PARTITION p0 VALUES LESS THAN (1970),
PARTITION p1 VALUES LESS THAN (1980),
PARTITION p2 VALUES LESS THAN (1990)
);
1. 刪除分區
ALTER TABLE members DROP PARTITION p1;
注意:如果刪掉了某分區,則該分區內的數據將全部丟失,不僅如此,在用show create table members\G;命令查看該表的創建語句時將無法看到被刪除分區的任何信息。
對於RANGE分區來說,如果刪除了p1分區,在插入數據時,如果日期在1970到1980區間之內,則該數據將會被分配到下一個分區,即p2,。
對於LIST分區,如果刪除了某一分區,在插入數據時,如果數據屬於這一分區,則插入會報錯。
如果只是刪除數據而不刪除該分區的信息,可使用truncate命令
ALTER TABLE members TRUNCATE PARTITION p1;
2. 添加分區
ALTER TABLE members ADD PARTITION (PARTITION p3 VALUES LESS THAN (2000));
注意:使用ADD命令來添加分區,只能在分區列表的末尾添加,具體到本例中,只能添加到1990年以後。
當然,在實際生產環境中,這樣的局限性太大,譬如我想將p0分區之前添加一個分區,區間為1960,或者將p1之間再添加一個1975的分區,這時候,用ADD將無法滿足此類需求,可使用ALTER TABLE ... REORGANIZE PARTITION命令。
譬如:
ALTER TABLE members REORGANIZE PARTITION p0 INTO (
PARTITION s0 VALUES LESS THAN (1960),
PARTITION s1 VALUES LESS THAN (1970)
);
REORGANIZE命令其實是相當靈活的,不僅能拆分分區,還可以用來合並分區,譬如:
ALTER TABLE members REORGANIZE PARTITION p0,p1,p2,p3 INTO (
PARTITION m0 VALUES LESS THAN (1980),
PARTITION m1 VALUES LESS THAN (2000)
);
注意:
1> 不能使用REORGANIZE PARTITION命令修改表的分區類型,只能通過ALTER TABLE ... PARTITION BY ....語句,譬如:
ALTER TABLE members
PARTITION BY HASH( YEAR(dob) )
PARTITIONS 8;
2> REORGANIZE PARTITION語法如下:
ALTER TABLE tbl_name
REORGANIZE PARTITION partition_list
INTO (partition_definitions);
partition_definitions中分區的范圍必須要涵蓋partition_list中的分區范圍。
二、如何管理HASH和KEY分區
以該分區表為例
CREATE TABLE clients (
id INT,
fname VARCHAR(30),
lname VARCHAR(30),
signed DATE
)
PARTITION BY HASH( MONTH(signed) )
PARTITIONS 12;
對於HASH分區和KEY分區,並不支持上述RANGE和LIST分區的語法,譬如DROP,TRUNCATE,REORGANIZE分區。
事實上,它只支持一種類型的“分區調整”。
ALTER TABLE clients COALESCE PARTITION 4;
該命令的作用在於將clients表的分區剪裁4個,從12個剪裁到8個。
ALTER TABLE clients ADD PARTITION PARTITIONS 6;
同樣,該命令為clients表增加了6個分區,從12個到18個。