在早期的MySQL版本中可以查询SHOW VARIABLES LIKE 'have_partitioning';变量参数来得知系统中是否会支持表分区而在MySQL5.6的版本后就不在使用该参数变量,默认都是支持分区功能,但是并不是所有的数据引擎都支持表分区的,其中目前可以使用表发分区功能引擎有:InnoDB、MyISAM、MEMORY另外还有BLACKHOLE引擎也是支持分区,但是BLACKHOLE引擎中的数据一切为空所以在使用分区并没有实际的意义,而使用较为多的就是InnoDB和MyISAM的引擎表上做分区,在这里需要注意的是在使用的时候需要注意在原先是什么表引擎分区的时候就必须是用什么表引擎,其次在使用InnoDB引擎表时建议开启innodb_file_per_table(独立表空间)这样表空间文件也是独立的便于管理,如果是在建立表分区时没有指定分区所在的路径默认是在datedir目录下的库文件夹下把表的数据文件下切分创建出许多小文件,当然在建表或修改表的时候如果有指定表文件的数据目录那么还可以使一张表分区后把数据放在不同的磁盘中,最后在使用的做分区的字段上需要定义成主键,如果原先有一个主键那么该处就会结合之前的主键形成联合主键,同时在该字段上因为主键原因该字段应该不为NULL,建议在建立表后再ALTER表添加修改表分区,这样可以确保修改创建表分区时不容易出错,因为在MySQL中表分区不同于Oracle中可以在建表后分区,分区时就会按照所给出的条件把数据划分至各个分区文件中,当然在MySQL中分区后还可以在分区的基础上再进行子分区,但是一般情况下一般很少使用,最后需要注意的一点如果删除分区时,也会丢失数据的,所以在删除表分区时需要慎重。其中在MySQL下的分区类型有以下四种:
ALTER TABLE `employee_tbl`
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id`, `date`); -- 之前id是主键,所以这里第2主键为联合主键
ALTER TABLE `employee_tbl` ADD PRIMARY KEY (`date`);
-- 这里为了便于管理分区名都已“p时间”来命名
ALTER TABLE `employee_tbl` PARTITION BY RANGE (to_days(date)) (
PARTITION `p20171101` VALUES LESS THAN (to_days('20171101')),
PARTITION `p20171102` VALUES LESS THAN (to_days('20171102')),
PARTITION `p20171103` VALUES LESS THAN (to_days('20171103')),
PARTITION `p20171104` VALUES LESS THAN (to_days('20171104')),
PARTITION `p20171105` VALUES LESS THAN (to_days('20171105')),
PARTITION `p20171106` VALUES LESS THAN (to_days('20171106')),
PARTITION `p20171107` VALUES LESS THAN (to_days('20171107')),
PARTITION `p20171108` VALUES LESS THAN (to_days('20171108')),
PARTITION `p20171109` VALUES LESS THAN (to_days('20171109')),
PARTITION `p20171110` VALUES LESS THAN (to_days('20171110'))
);
这样按天进行分区就创完毕,当然如果感觉不够满意还可以重新分区,后期添加分区也很简单:
1
ALTER TABLE employee_tbl ADD PARTITION (PARTITION p20171111 VALUES LESS THAN (TO_DAYS ('2017-11-11')));
删除分区:
1
ALTER TABLE employee_tbl DROP PARTITION p20171101;
最后我们可以通过查询MySQL的系统字典库得知所有的分区详情信息
1
2
3
4
5
6
SELECT
*
FROM
information_schema. PARTITIONS t
WHERE
t.PARTITION_NAME IS NOT NULL