Mysql5.6增加了对分区的置换功能。它与SQLServer的分区置换有些不同,SQLServer中分区置换到普通表时,普通表必须为空,而mysql没有这个要求。
例:
1.普通表为空表时,进行分区置换
#创建分区表
CREATE TABLE t15(id INT NOT NULL)
PARTITION BY RANGE (id) (
PARTITION p0 VALUES LESS THAN (100),
PARTITION p1 VALUES LESS THAN (200),
PARTITION p2 VALUES LESS THAN (300),
PARTITION p3 VALUES LESS THAN MAXVALUE);
INSERT INTO t15 SELECT 1;
INSERT INTO t15 SELECT 105;
INSERT INTO t15 SELECT 201;
INSERT INTO t15 SELECT 301;
ALTER TABLE t15 ANALYZE PARTITION ALL;
SELECT table_name,partition_name,table_rows FROM information_schema.PARTITIONS WHERE table_name = 't15';
通过视图可以看到每个分区中都有1条记录:
#创建普通表
CREATE TABLE t25(id INT);
#置换分区
ALTER TABLE t15 exchange PARTITION p0 WITH TABLE t25;错误码: 1736Tables have different definitions
报错,显示表的定义不一致,置换分区时,分区表和普通表的定义应一致,包括索引、约束等。
#重建普通表,并置换分区
DROP TABLE t25;
CREATE TABLE t25(id INT NOT NULL);
ALTER TABLE t15 exchange PARTITION p0 WITH TABLE t25;
SELECT table_name,partition_name,table_rows FROM information_schema.PARTITIONS WHERE table_name LIKE 't%5';置换成功:
2.普通表为非空表时,进行分区置换
#往普通表里写入部分记录,再置换
INSERT INTO t25 SELECT 1000;
ALTER TABLE t15 exchange PARTITION p0 WITH TABLE t25; 错误码: 1737
Found a row that does not match the partition
报错,显示有不符合分区条件的记录存在。
我们由t15表定义可知,p0分区的分区列值应小于100,而t25表中有一条记录的 值为1000,不符合p0分区的条件,所以置换失败。
#重新清空t25表,再插入几条符合p0分区条件的范围内记录,再进行分区置换
TRUNCATE TABLE t25;
INSERT INTO t25 SELECT 99;
INSERT INTO t25 SELECT 98;
INSERT INTO t25 SELECT 1;
ALTER TABLE t15 ANALYZE PARTITION ALL;
SELECT table_name,partition_name,table_rows FROM information_schema.PARTITIONS WHERE table_name LIKE 't%5'由上图可见,普通表中的3条记录被置换到了t15表的p0分区中。
如果p0分区中有记录的话,p0分区的记录也会置换到普通表t25。
本文详细介绍了MySQL 5.6中新增的分区置换功能,对比了与SQL Server的不同之处,并通过实例演示了如何在普通表为空及非空情况下进行分区置换。
2783

被折叠的 条评论
为什么被折叠?



