以常用的RANGE分区为例,还有其他分区类型LIST、HASH分区、KEY分区
创建表并指定分区(脚本不要分开执行):year小于2019年的放在p2018分区、大于2019小于2020放在分区p2019……
CREATE TABLE my_table (
id INT NOT NULL AUTO_INCREMENT,
year INT NOT NULL,
data VARCHAR(255),
PRIMARY KEY (id, year)
)
PARTITION BY RANGE (year)(
partition p2018 values less than(2019),
partition p2019 values less than(2020),
partition p2020 values less than(2021),
partition p2021 values less than(2022),
partition p2022 values less than(2023),
partition p2023 values less than(2024),
PARTITION p9999 VALUES LESS THAN MAXVALUE
);
-- 建表时没有建分区,建完表之后添加分区:
ALTER TABLE my_table PARTITION BY RANGE (year) (
partition p2018 values less than(2019),
partition p2019 values less than(2020),
partition p2020 values less than(2021),
partition p2021 values less than(2022),
partition p2022 values less than(2023),
partition p2023 values less than(2024),
PARTITION p9999 VALUES LESS THAN MAXVALUE
);
-- 删除分区(数据还在):
ALTER TABLE my_table remove partitioning;
-- 删除分区(指定分区名),分区里面的数据也会被删除
alter table my_table drop partition p2024;
-- 检查分区状态是否正常
ALTER TABLE my_table CHECK PARTITION p2021,p2022;
-- 查询指定的分区
select * from my_table partition(p2020) where year = 2020;
-- 查询表中的分区信息
select * from information_schema.partitions where table_name = 'my_table'
-- explain查看执行计划,可以看到查询的分区
explain select * from my_table where year = 2020;
-- 添加分区
alter table my_table add partition(partition p2024 values less than(2025));
-- 重构分区,数据转移到新的分区(s0和s1是当前分区名)
ALTER TABLE my_table REORGANIZE PARTITION s0,s1
INTO(partition p2020 values less than(2020),partition p2025 values less than(2025));