1.关于分区注解
有分区的sql语句,后面都会有一段注解描述:/*! 50100 PARTITION BY... */
CREATE TABLE `test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`tm` date NOT NULL,
PRIMARY KEY (`id`,`tm`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
/*!50100 PARTITION BY RANGE (to_days(tm))
(PARTITION p0 VALUES LESS THAN (738214) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (738245) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (738275) ENGINE = InnoDB) */;
1、/*...*/ 是注释,mysql不会执行。
2、mysql对标准sql进行了扩展,包含了一些自己的特性。
3、/*!...*/ 是一种特殊的注释,其他的数据库产品当然不会执行。mysql特殊处理,会选择性的执行。可以认为是:预编译中的条件编译。
4、特别注意 50100,它表示5.01.00 版本或者更高的版本,才执行
2.创建分区
ALTER TABLE tb_name PARTITION by RANGE(to_days(createTime))
(
PARTITION p20200527 VALUES LESS THAN (to_days('2020-05-28')),
PARTITION p20200528 VALUES LESS THAN (to_days('2020-05-29')),
PARTITION p20200529 VALUES LESS THAN (to_days('2020-05-30'))
);
1、tb_name安排RANGE方式分区
2、按照createTime的TO_DAY()函数值进行连续分区
3.查看表分区情况和数据分布
SELECT
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
FROM
information_schema.PARTITIONS
WHERE
table_schema = SCHEMA ( )
AND table_name = 'test';
4.查询指定分区数据
SELECT
*
FROM
表名 PARTITION ( 分区名 );
5.管理分区
新增分区
ALTER TABLE sale_data
ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
删除分区
--清除所有分区,不删除数据
ALTER TABLE tb_name REMOVE PARTITIONING;
--当删除了一个分区,也同时删除了该分区中所有的数据。
ALTER TABLE sale_data DROP PARTITION p201010;
分区的合并
下面的SQL,将p201001 - p201009 合并为3个分区p2010Q1 - p2010Q3
ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);