Mysql表分区的操作方法

62次阅读
没有评论

共计 4744 个字符,预计需要花费 12 分钟才能阅读完成。

这篇文章主要讲解了“Mysql 表分区的操作方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“Mysql 表分区的操作方法”吧!

Mysql 表分区操作及相关操作  

将 ID 设为自增长 ID 
alter table pw_trade_record_temp change ID ID int(4) auto_increment; 

分区字段必需为主键,修改主键  

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

直接在建表时创建表分区  

创建 range 分区  

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 

); 

以员工工资为依据做范围分区。 

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) 表达式(计算员工的出生日期)作为范围分区依据。这里最值得注意的是表达式必须有返回值下载地址    。 

创建 list 分区  

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) 

); 

以部门作为分区依据,每个部门做一分区。 

创建 hash 分区  

HASH 分区主要用来确保数据在预先确定数目的分区中平均分布。在 RANGE 和 LIST 分区中,必须明确指定一个给定的列值或列值集合应该保存在哪 个分区中;而在 HASH 分区中,MySQL 自动完成这些工作,你所要做的只是基于将要被哈希的列值指定一个列值或表达式,以及指定被分区的表将要被分割成的分区数量下载地址  。 

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; 

创建 key 分区  

按照 KEY 进行分区类似于按照 HASH 分区,除了 HASH 分区使用的用户定义的表达式,而 KEY 分区的哈希函数是由 MySQL 服务器提供,服务器使用其自己内部的哈希函数,这些函数是基于与 PASSWORD() 一样的运算法则。“CREATE TABLE …PARTITION BY KEY”的语法规则类似于创建一个通过 HASH 分区的表的规则。它们唯一的区别在于使用的关键字是 KEY 而不是 HASH,并且 KEY 分区只采用一个或多个 列名的一个列表下载地址  。 

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; 

创建复合分区  

range – hash(范围哈希) 复合分区  

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 复合分区  

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 复合分区  

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 复合分区  

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) 

修改现有未分区的表,给表做分区  

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); 

增加分区  
alter table pw_trade_record add partition (partition p20160518 values in (UNIX_TIMESTAMP( 2016-05-18))); 

删除分区 (一次性可删除多个分区) 
alter table pw_trade_record drop partition p20140101,p20160501,…; 

删除表的所有分区  
Alter table emp removepartitioning;– 不会丢失数据  

合并表分区  
示例:将表分区 p20140101,p20160501 合并到 p20160501 分区中  
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 
); 

分解表分区  
示例:将表分区 pmax 分解成 p20160518 和 pmax 两个分区  
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 
); 

查看分区表状态  
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 分区表: 

Alter table emp partition by hash(salary)partitions 7;  —- 不会丢失数据  

重新定义 range 分区表: 

Alter table emp partitionbyrange(salary) 

partition p1 values less than (2000), 

partition p2 values less than (4000) 

); —- 不会丢失数据  

重建分区: 

这和先删除保存在分区中的所有记录,然后重新插入它们,具有同样的效果。它可用于整理分区碎片。 

ALTER TABLE emp rebuild partitionp1,p2; 

优化分区: 

如果从分区中删除了大量的行,或者对一个带有可变长度的行(也就是说,有 VARCHAR,BLOB,或 TEXT 类型的列)作了许多修改,可以使用“ALTER TABLE … OPTIMIZE PARTITION”来收回没有使用的空间,并整理分区数据文件的碎片。 

ALTER TABLE emp optimize partition p1,p2; 

分析分区: 

读取并保存分区的键分布。 

ALTER TABLE emp analyze partition p1,p2; 

修补分区: 

修补被破坏的分区。 

ALTER TABLE emp repairpartition p1,p2; 

检查分区: 

可以使用几乎与对非分区表使用 CHECK TABLE 相同的方式检查分区。 

ALTER TABLE emp CHECK partition p1,p2; 

这个命令可以告诉你表 emp 的分区 p1,p2 中的数据或索引是否已经被破坏。如果发生了这种情况,使用“ALTER TABLE … REPAIR PARTITION”来修补该分区。 

感谢各位的阅读,以上就是“Mysql 表分区的操作方法”的内容了,经过本文的学习后,相信大家对 Mysql 表分区的操作方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计4744字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)