一、分区条件
- 一个表最多只能有1024个分区。
- MySQL5.1之后,才支持表分区功能,且分区表达式必须是整数。
- MySQL5.5之后,增加了COLUMNS分区(RANGE / LIST),支持整形、日期、字符串。
- 分区字段,必须包含在主键字段内。
二、预处理主键
目的:将分区字段添加到主键
ALTER TABLE <表名> DROP PRIMARY KEY, ADD PRIMARY KEY (`id`, `<分区字段>`);
例如:
ALTER TABLE tb_article DROP PRIMARY KEY, ADD PRIMARY KEY (`id`, `cdate`);
三、创建分区
定义分区规则:
PARTITION BY [ RANGE | LIST ] COLUMNS(<分区字段>)(
PARTITION <分区名> VALUES <分区规则>,
...
)
可以在建表(CREATE TABLE)时直接创建分区:
CREATE TABLE `<表名>` (
`<ID字段名>` varchar(20) NOT NULL COMMENT 'ID',
`<分区字段名>` varchar(20) NOT NULL COMMENT '分区',
... , PRIMARY KEY (`<ID字段名>`, `<分区字段名>`)
)
PARTITION BY [ RANGE | LIST ] COLUMNS(<分区字段>)(
PARTITION <分区名> VALUES <分区规则>,
...
);
也可以为现有表创建分区(ALTER TABLE),但需要提前将分区字段添加到主键。
ALTER TABLE `<表名>`
PARTITION BY [ RANGE | LIST ] COLUMNS(<分区字段>)(
PARTITION <分区名> VALUES <分区规则>,
...
);
四、添加分区
ALTER TABLE `<表名>` ADD PARTITION (
PARTITION <分区名> VALUES <分区规则>,
...
);
五、删除分区
同时也会删除分区内的数据
ALTER TABLE `<表名>` DROP PARTITION <分区名>;
六、实例1:创建 RANGE COLUMNS 分区
CREATE TABLE tb_article (
id VARCHAR(20) NOT NULL,
title VARCHAR(50) NOT NULL,
cdate DATE NOT NULL, PRIMARY KEY (id, cdate)
)
PARTITION BY RANGE COLUMNS(cdate)(
PARTITION p2018 values less than ('2018'),
PARTITION p2019 values less than ('2019'),
PARTITION p2020 values less than (MAXVALUE)
);
七、实例2:创建 LIST COLUMNS 分区
CREATE TABLE tb_article (
id VARCHAR(20) NOT NULL,
title VARCHAR(50) NOT NULL,
region VARCHAR(20) NOT NULL, PRIMARY KEY (id, region)
)
PARTITION BY LIST COLUMNS(region)(
PARTITION pEast values in ('east'),
PARTITION pWest values in ('west'),
PARTITION pNorth values in ('north'),
PARTITION pSouth values in ('south')
);
八、分区的应用
- 按分区检索
SELECT * FROM tb_article PARTITION(pEast);
SELECT atc.*
FROM tb_article PARTITION(pEast) atc INNER JOIN tb_region rg ON rg.region = atc.region;
- 删除分区内的数据
DELETE FROM tb_artical PARTITION(pEast)
- 修改分区内的数据
UPDATE tb_artical PARTITION(pEast) SET title = CONCAT(title, ' - modify') WHERE id = 'xxx001';