MySQL 橫向表分區之RANGE分區小結


MySQL 橫向表分區之RANGE分區小結

by:授客 QQ1033553122

目錄

簡介 1

RANGE分區 1

創建分區表 1

查看表分區 2

新增表分區 2

新增數據 3

分區表查詢 3

刪除數據 4

刪除分區 4

 

簡介

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

MySQL <wbr>橫向表分區之RANGE分區小結

 

和查詢一樣,如果涉及到多個分區,則逗號分隔

DELETE FROM auth_user_group2 PARTITION (p2, p3) WHERE id = 1

 

 

刪除分區

ALTER TABLE auth_user_group2 DROP PARTITION p3

 

注意:刪除分區也會刪除記錄

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM