一、分區(qū)條件
- 一個表最多只能有1024個分區(qū)。
- MySQL5.1之后,才支持表分區(qū)功能,且分區(qū)表達式必須是整數(shù)。
- MySQL5.5之后,增加了COLUMNS分區(qū)(RANGE / LIST),支持整形、日期、字符串。
- 分區(qū)字段,必須包含在主鍵字段內(nèi)。
二、預(yù)處理主鍵
目的:將分區(qū)字段添加到主鍵
ALTER TABLE <表名> DROP PRIMARY KEY, ADD PRIMARY KEY (`id`, `<分區(qū)字段>`);
例如:
ALTER TABLE tb_article DROP PRIMARY KEY, ADD PRIMARY KEY (`id`, `cdate`);
三、創(chuàng)建分區(qū)
定義分區(qū)規(guī)則:
PARTITION BY [ RANGE | LIST ] COLUMNS(<分區(qū)字段>)(
PARTITION <分區(qū)名> VALUES <分區(qū)規(guī)則>,
...
)
可以在建表(CREATE TABLE)時直接創(chuàng)建分區(qū):
CREATE TABLE `<表名>` (
`<ID字段名>` varchar(20) NOT NULL COMMENT 'ID',
`<分區(qū)字段名>` varchar(20) NOT NULL COMMENT '分區(qū)',
... , PRIMARY KEY (`<ID字段名>`, `<分區(qū)字段名>`)
)
PARTITION BY [ RANGE | LIST ] COLUMNS(<分區(qū)字段>)(
PARTITION <分區(qū)名> VALUES <分區(qū)規(guī)則>,
...
);
也可以為現(xiàn)有表創(chuàng)建分區(qū)(ALTER TABLE),但需要提前將分區(qū)字段添加到主鍵。
ALTER TABLE `<表名>`
PARTITION BY [ RANGE | LIST ] COLUMNS(<分區(qū)字段>)(
PARTITION <分區(qū)名> VALUES <分區(qū)規(guī)則>,
...
);
四、添加分區(qū)
ALTER TABLE `<表名>` ADD PARTITION (
PARTITION <分區(qū)名> VALUES <分區(qū)規(guī)則>,
...
);
五、刪除分區(qū)
同時也會刪除分區(qū)內(nèi)的數(shù)據(jù)
ALTER TABLE `<表名>` DROP PARTITION <分區(qū)名>;
六、實例1:創(chuàng)建 RANGE COLUMNS 分區(qū)
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:創(chuàng)建 LIST COLUMNS 分區(qū)
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')
);
八、分區(qū)的應(yīng)用
- 按分區(qū)檢索
SELECT * FROM tb_article PARTITION(pEast);
SELECT atc.*
FROM tb_article PARTITION(pEast) atc INNER JOIN tb_region rg ON rg.region = atc.region;
- 刪除分區(qū)內(nèi)的數(shù)據(jù)
DELETE FROM tb_artical PARTITION(pEast)
- 修改分區(qū)內(nèi)的數(shù)據(jù)
UPDATE tb_artical PARTITION(pEast) SET title = CONCAT(title, ' - modify') WHERE id = 'xxx001';