MySQL 分区表分为RANGE、LIST、HASH、KEY四种类型,分区表的索引可以局部针对分区表建立。

一、 创建

1. 创建范围分区表

MySQL 分区表的分区键order_day必须包含在主键中,且会产生一个问题——当年份超过阈值,到了2013,2014时,需要手动创建这些分区

CREATE TABLE sales (
    id INT AUTO_INCREMENT,
    amount DOUBLE NOT NULL,
    order_day DATETIME NOT NULL,
    PRIMARY KEY(id, order_day)
) ENGINE=Innodb PARTITION BY RANGE(YEAR(order_day)) (
    PARTITION p_01 VALUES LESS THAN (2010),
    PARTITION p_2011 VALUES LESS THAN (2011),
    PARTITION p_2012 VALUES LESS THAN (2012),
    PARTITION p_catchall VALUES LESS THAN MAXVALUE);

2. 创建hash分区表

以下语句表示每100W条数据建立一个分区,且没有阈值范围的影响

CREATE TABLE sales (
    id INT PRIMARY KEY AUTO_INCREMENT,
    amount DOUBLE NOT NULL,
    order_day DATETIME NOT NULL
) ENGINE=Innodb PARTITION BY HASH(id DIV 1000000);

 

二、 分区表的管理操作

  • 查看是否支持分区
mysql> show variables like "%part%";  
+-------------------+-------+  
| Variable_name     | Value |  
+-------------------+-------+  
| have_partitioning | YES   |  
+-------------------+-------+  
1 row in set (0.00 sec)
  • 查表的各个分区
SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'history_uint';
  • 删除分区

注意不可以删除hash或者key分区

alter table emp drop partition p1;
-- 一次性删除多个分区
alter table emp drop partition p1,p2;
  • 增加分区
alter table emp add partition (partition p3 values less than (4000));
alter table empl add partition (partition p3 values in (40));
  • 拆分分区

Reorganize partition可以对表的部分分区或全部分区进行修改,并且不会丢失数据,拆分前后分区的整体范围应该一致。

alter table te reorganize partition p1 into
(partition p1 values less than (100),
partition p3 values less than (1000)); ----不会丢失数据
  • 合并分区
-- Merge分区:把2个分区合并为一个
alter table te reorganize partition p1,p3 into
(partition p1 values less than (1000)); ----不会丢失数据
  • 重新定义hash分区表
Alter table emp partition by hash(salary) partitions 7;
  • 重新定义range分区表
Alter table emp partition by range(salary)
(partition p1 values less than (2000),
partition p2 values less than (4000));
  • 删除表的所有分区

相当于变回普通表,注意不是删数据。

Alter table emp remove partitioning;--不会丢失数据
  • 重建分区

相当于先删除分区中的所有记录,然后重新插入它们,可用于整理分区碎片。

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;
  • 检查分区

检查分区,类似于对非分区表使用CHECK TABLE。这个命令可以告诉你表emp的分区p1,p2中的数据或索引是否已经被破坏。如果已被破坏,可使用修补命令修补该分区。

ALTER TABLE emp CHECK partition p1,p2;
  • 修补分区

修补被破坏的分区

ALTER TABLE emp repair partition p1,p2;