MySQL 橫向表分區之RANGE分區小結
by:授客 QQ:1033553122
目錄
簡介
mysql表分區--RANGE分區,屬於橫向分區。舉例說,假如有100條數據,分成十份,前10條數據放到第一個分區,第二個10條數據放到第二個分區,依此類推。橫向分區,並不會改變表的結構。
RANGE分區
基於屬於一個給定連續區間的列值,把多行分配給分區。
創建分區表
例子:按user_id分區,創建分區表
CREATE TABLE `auth_user_group` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NOT NULL,
`group_id` INT(11) NOT NULL,
PRIMARY KEY (id, user_id)
)
PARTITION BY RANGE(user_id) (
PARTITION p1 VALUES LESS THAN (6),
PARTITION p2 VALUES LESS THAN (11),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
注意:
1、分區字段必須是主鍵、聯合主鍵的一部分,否則會報如下錯誤:
A PRIMARY KEY must include all columns in the table's partitioning function
2、分區字段值的設置必須是連續的,否則會報錯
注解:
PARTITION 分區名 VALUES THAN (字段值)
如上表定義,意為,user_id值小於6的記錄,存放在p1表分區,值大於等於6,小於11的記錄,存放在p2表分區,小於最大值,大於等於11的記錄,都存放在pmax分區。
查看表分區
SHOW CREATE TABLE table_name;
例子:
SHOW CREATE TABLE auth_user_group;
結果如下:
CREATE TABLE `auth_user_group` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NOT NULL,
`group_id` INT(11) NOT NULL,
PRIMARY KEY (`id`,`user_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
新增表分區
注意:如果創建分區表時,使用了MAXVALUE,形如:
PARTITION pmax VALUES LESS MAXVALUE,那么新增分區時會報錯,類似如下:
MAXVALUE can only be used in last partition definition
原因:因為新增分區時,是在原有分區列表末尾繼續添加,而THAN MAXVALUE正好位於末尾,同時其也包含了要添加的分區范圍,所提系統會任務沖突,解決方法,定義分區表時,不設置MAXVALUE,如下:
CREATE TABLE `auth_user_group2` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NOT NULL,
`group_id` INT(11) NOT NULL,
PRIMARY KEY (id, user_id)
)
PARTITION BY RANGE(user_id) (
PARTITION p1 VALUES LESS THAN (6),
PARTITION p2 VALUES LESS THAN (11)
);
ALTER TABLE auth_user_group2 ADD PARTITION
(PARTITION p3 VALUES LESS THAN (21),
PARTITION p4 VALUES LESS THAN (31)
)
新增數據
和普通插入一樣,但是要注意的是,分區字段值不能超過給定分區的最大值(例中為30),
例:
INSERT INTO auth_user_group2(user_id, group_id) VALUES(39, 30);
報錯:
Table has no partition for value 39
修改改成這樣就可以:
INSERT INTO auth_user_group2(user_id, group_id) VALUES(10, 30);
分區表查詢
增對分區表,我們在查詢時可以指定分區,加快查詢速度。
SELECT * FROM auth_user_group2 PARTITION(p2)
如果涉及多個分區,則用逗號隔開。
SELECT * FROM auth_user_group2 PARTITION(p2, p3)
刪除數據
增對分區表,我們在刪除時可以指定分區,避免檢索帶來的時間消耗。
DELETE FROM auth_user_group2 PARTITION (p2) WHERE id = 1
和查詢一樣,如果涉及到多個分區,則逗號分隔
DELETE FROM auth_user_group2 PARTITION (p2, p3) WHERE id = 1
刪除分區
ALTER TABLE auth_user_group2 DROP PARTITION p3
注意:刪除分區也會刪除記錄