共計 4744 個字符,預計需要花費 12 分鐘才能閱讀完成。
這篇文章主要講解了“Mysql 表分區(qū)的操作方法”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“Mysql 表分區(qū)的操作方法”吧!
Mysql 表分區(qū)操作及相關操作
將 ID 設為自增長 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`);
直接在建表時創(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) 表達式(計算員工的出生日期)作為范圍分區(qū)依據(jù)。這里最值得注意的是表達式必須有返回值下載地址 。
創(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ù),每個部門做一分區(qū)。
創(chuàng)建 hash 分區(qū)
HASH 分區(qū)主要用來確保數(shù)據(jù)在預先確定數(shù)目的分區(qū)中平均分布。在 RANGE 和 LIST 分區(qū)中,必須明確指定一個給定的列值或列值集合應該保存在哪 個分區(qū)中;而在 HASH 分區(qū)中,MySQL 自動完成這些工作,你所要做的只是基于將要被哈希的列值指定一個列值或表達式,以及指定被分區(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 進行分區(qū)類似于按照 HASH 分區(qū),除了 HASH 分區(qū)使用的用戶定義的表達式,而 KEY 分區(qū)的哈希函數(shù)是由 MySQL 服務器提供,服務器使用其自己內(nèi)部的哈希函數(shù),這些函數(shù)是基于與 PASSWORD() 一樣的運算法則。“CREATE TABLE …PARTITION BY KEY”的語法規(guī)則類似于創(chuàng)建一個通過 HASH 分區(qū)的表的規(guī)則。它們唯一的區(qū)別在于使用的關鍵字是 KEY 而不是 HASH,并且 KEY 分區(qū)只采用一個或多個 列名的一個列表下載地址 。
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)建復合分區(qū)
range – hash(范圍哈希) 復合分區(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 復合分區(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 復合分區(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 復合分區(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ū) (一次性可刪除多個分區(qū))
alter table pw_trade_record drop partition p20140101,p20160501,…;
刪除表的所有分區(qū)
Alter table emp removepartitioning;– 不會丟失數(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 兩個分區(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; —- 不會丟失數(shù)據(jù)
重新定義 range 分區(qū)表:
Alter table emp partitionbyrange(salary)
(
partition p1 values less than (2000),
partition p2 values less than (4000)
); —- 不會丟失數(shù)據(jù)
重建分區(qū):
這和先刪除保存在分區(qū)中的所有記錄,然后重新插入它們,具有同樣的效果。它可用于整理分區(qū)碎片。
ALTER TABLE emp rebuild partitionp1,p2;
優(yōu)化分區(qū):
如果從分區(qū)中刪除了大量的行,或者對一個帶有可變長度的行(也就是說,有 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;
修補分區(qū):
修補被破壞的分區(qū)。
ALTER TABLE emp repairpartition p1,p2;
檢查分區(qū):
可以使用幾乎與對非分區(qū)表使用 CHECK TABLE 相同的方式檢查分區(qū)。
ALTER TABLE emp CHECK partition p1,p2;
這個命令可以告訴你表 emp 的分區(qū) p1,p2 中的數(shù)據(jù)或索引是否已經(jīng)被破壞。如果發(fā)生了這種情況,使用“ALTER TABLE … REPAIR PARTITION”來修補該分區(qū)。
感謝各位的閱讀,以上就是“Mysql 表分區(qū)的操作方法”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對 Mysql 表分區(qū)的操作方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!