溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Mysql表分區(qū)的操作方法

發(fā)布時(shí)間:2021-08-12 10:11:00 來源:億速云 閱讀:170 作者:chen 欄目:MySQL數(shù)據(jù)庫

這篇文章主要講解了“Mysql表分區(qū)的操作方法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Mysql表分區(qū)的操作方法”吧!

Mysql 表分區(qū)操作及相關(guān)操作 

將ID設(shè)為自增長ID 
alter table pw_trade_record_temp change ID ID int(4) auto_increment; 

分區(qū)字段必需為主鍵,修改主鍵 

ALTER TABLE `pw_trade_record` 
DROP PRIMARY KEY, 
ADD PRIMARY KEY (`ID`, `TRADE_TIME`); 

直接在建表時(shí)創(chuàng)建表分區(qū) 

創(chuàng)建range分區(qū) 

create table emp 

(empno varchar(20) not null , 

empname varchar(20), 

deptno int, 

birthdate date, 

salary int 



partition by range(salary) 



partition p1 values less than (1000), 

partition p2 values less than (2000), 

partition p3 values less than maxvalue 

); 

以員工工資為依據(jù)做范圍分區(qū)。 

create table emp 

(empno varchar(20) not null , 

empname varchar(20), 

deptno int, 

birthdate date not null, 

salary int 



partition by range(year(birthdate)) 



partition p1 values less than (1980), 

partition p2 values less than (1990), 

partition p3 values less than maxvalue 

); 

以year(birthdate)表達(dá)式(計(jì)算員工的出生日期)作為范圍分區(qū)依據(jù)。這里最值得注意的是表達(dá)式必須有返回值下載地址   。 

創(chuàng)建list分區(qū) 

create table emp 

(empno  varchar(20) not null , 

empname varchar(20), 

deptno  int, 

birthdate date not null, 

salary int 



partition by list(deptno) 



partition p1 values in  (10), 

partition p2 values in  (20), 

partition p3 values  in  (30) 

); 

以部門作為分區(qū)依據(jù),每個(gè)部門做一分區(qū)。 

創(chuàng)建hash分區(qū) 

HASH分區(qū)主要用來確保數(shù)據(jù)在預(yù)先確定數(shù)目的分區(qū)中平均分布。在RANGE和LIST分區(qū)中,必須明確指定一個(gè)給定的列值或列值集合應(yīng)該保存在哪 個(gè)分區(qū)中;而在HASH分區(qū)中,MySQL 自動(dòng)完成這些工作,你所要做的只是基于將要被哈希的列值指定一個(gè)列值或表達(dá)式,以及指定被分區(qū)的表將要被分割成的分區(qū)數(shù)量下載地址 。 

create table emp 

(empno varchar(20) not null , 

empname varchar(20), 

deptno int, 

birthdate date not null, 

salary int 



partition by hash(year(birthdate)) 

partitions 4; 

創(chuàng)建key分區(qū) 

按照KEY進(jìn)行分區(qū)類似于按照HASH分區(qū),除了HASH分區(qū)使用的用戶定義的表達(dá)式,而KEY分區(qū)的哈希函數(shù)是由MySQL 服務(wù)器提供,服務(wù)器使用其自己內(nèi)部的哈希函數(shù),這些函數(shù)是基于與PASSWORD()一樣的運(yùn)算法則。“CREATE TABLE ...PARTITION BY KEY”的語法規(guī)則類似于創(chuàng)建一個(gè)通過HASH分區(qū)的表的規(guī)則。它們唯一的區(qū)別在于使用的關(guān)鍵字是KEY而不是HASH,并且KEY分區(qū)只采用一個(gè)或多個(gè) 列名的一個(gè)列表下載地址 。 

create table emp 

(empno varchar(20) not null , 

empname varchar(20), 

deptno int, 

birthdate date not null, 

salary int 



partition by key(birthdate) 

partitions 4; 


創(chuàng)建復(fù)合分區(qū) 


range - hash(范圍哈希)復(fù)合分區(qū) 

create table emp 

(empno varchar(20) not null , 

empname varchar(20), 

deptno int, 

birthdate date not null, 

salary int 



partition by range(salary) 

subpartition by hash(year(birthdate)) 

subpartitions 3 



partition p1 values less than (2000), 

partition p2 values less than maxvalue 

); 

range- key復(fù)合分區(qū) 

create table emp 

(empno varchar(20) not null , 

empname varchar(20), 

deptno int, 

birthdate date not null, 

salary int 



partition by range(salary) 

subpartition by key(birthdate) 

subpartitions 3 



partition p1 values less than (2000), 

partition p2 values less than maxvalue 

); 

list - hash復(fù)合分區(qū) 

CREATE TABLE emp ( 

empno varchar(20) NOT NULL, 

empname varchar(20) , 

deptno int, 

birthdate date NOT NULL, 

salary int 



PARTITION BY list (deptno) 

subpartition by hash(year(birthdate)) 

subpartitions 3 



PARTITION p1 VALUES in  (10), 

PARTITION p2 VALUES in  (20) 





list - key 復(fù)合分區(qū) 

CREATE TABLE empk ( 

empno varchar(20) NOT NULL, 

empname varchar(20) , 

deptno int, 

birthdate date NOT NULL, 

salary int 



PARTITION BY list (deptno) 

subpartition by key(birthdate) 

subpartitions 3 



PARTITION p1 VALUES in  (10), 

PARTITION p2 VALUES in  (20) 




修改現(xiàn)有未分區(qū)的表,給表做分區(qū) 

ALTER TABLE `pw_trade_record` 
PARTITION BY RANGE(UNIX_TIMESTAMP(TRADE_TIME)) 

PARTITION p20160501 VALUES LESS THAN (UNIX_TIMESTAMP('2016-05-01')), 
PARTITION pmax VALUES LESS THAN MAXVALUE); 


增加分區(qū) 
alter table pw_trade_record add partition (partition p20160518 values in (UNIX_TIMESTAMP('2016-05-18'))); 

刪除分區(qū)(一次性可刪除多個(gè)分區(qū)) 
alter table pw_trade_record drop partition p20140101,p20160501,...; 

刪除表的所有分區(qū) 
Alter table emp removepartitioning;--不會(huì)丟失數(shù)據(jù) 

合并表分區(qū) 
示例:將表分區(qū)p20140101,p20160501合并到p20160501分區(qū)中 
alter table pw_trade_record reorganize partition p20140101,p20160501 into 
(partition p20160501 values less than (UNIX_TIMESTAMP('2016-05-18')), 
PARTITION pmax VALUES LESS THAN MAXVALUE 
); 

分解表分區(qū) 
示例:將表分區(qū)pmax分解成p20160518和pmax兩個(gè)分區(qū) 
alter table pw_trade_record reorganize partition pmax into 
(partition p20160518 values less than (UNIX_TIMESTAMP('2016-05-18')), 
PARTITION pmax VALUES LESS THAN MAXVALUE 
); 

查看分區(qū)表狀態(tài) 
select table_schema,table_name,partition_name,partition_ordinal_position,partition_method,partition_expression,partition_description,table_rows,avg_row_length,data_length from INFORMATION_SCHEMA.PARTITIONS where table_name='pw_trade_record'; 


重新定義hash分區(qū)表: 

Alter table emp partition by hash(salary)partitions 7;  ----不會(huì)丟失數(shù)據(jù) 

重新定義range分區(qū)表: 

Alter table emp partitionbyrange(salary) 



partition p1 values less than (2000), 

partition p2 values less than (4000) 

); ----不會(huì)丟失數(shù)據(jù) 


重建分區(qū): 

這和先刪除保存在分區(qū)中的所有記錄,然后重新插入它們,具有同樣的效果。它可用于整理分區(qū)碎片。 

ALTER TABLE emp rebuild partitionp1,p2; 


優(yōu)化分區(qū): 

如果從分區(qū)中刪除了大量的行,或者對(duì)一個(gè)帶有可變長度的行(也就是說,有VARCHAR,BLOB,或TEXT類型的列)作了許多修改,可以使用“ALTER TABLE ... OPTIMIZE PARTITION”來收回沒有使用的空間,并整理分區(qū)數(shù)據(jù)文件的碎片。 

ALTER TABLE emp optimize partition p1,p2; 

分析分區(qū): 

讀取并保存分區(qū)的鍵分布。 

ALTER TABLE emp analyze partition p1,p2; 

修補(bǔ)分區(qū): 

修補(bǔ)被破壞的分區(qū)。 

ALTER TABLE emp repairpartition p1,p2; 

檢查分區(qū): 

可以使用幾乎與對(duì)非分區(qū)表使用CHECK TABLE 相同的方式檢查分區(qū)。 

ALTER TABLE emp CHECK partition p1,p2; 

這個(gè)命令可以告訴你表emp的分區(qū)p1,p2中的數(shù)據(jù)或索引是否已經(jīng)被破壞。如果發(fā)生了這種情況,使用“ALTER TABLE ... REPAIR PARTITION”來修補(bǔ)該分區(qū)。 

感謝各位的閱讀,以上就是“Mysql表分區(qū)的操作方法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Mysql表分區(qū)的操作方法這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI