一.概念
1.range分區:根據分區鍵值的範圍對數據行存儲到表的不同分區中;多個分區的範圍要連續,但是不能重疊,默認情況下使用values less than屬性,即每個分區不包含設置的那個值,上限取不到。
2.使用場景:分區鍵是日期或者時間
3..分區注意事項
1.具有主鍵或唯一索引的表,主鍵或唯一索引必須是分區鍵的一部分。
2.對分區表進行查詢最好在where從句中包含分區鍵
3.結合業務場景選擇分區鍵,避免分區查詢。
二.案例:
1.sql語句:
CREATE TABLE `bonc_test`.`user_login_tb` (
`user_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) NOT NULL,
`ip` varchar(255) NOT NULL,
`login_time` datetime(0) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8
partition by RANGE(YEAR(login_time))(
partition p0 values less than(2014),
partition p1 values less than(2015),
partition p2 values less than(2017)
);
當有主鍵的表時會出現,
A PRIMARY KEY must include all columns in the table's partitioning function。
分區的字段必須是要包含在主鍵當中。這時候分區的字段要麼是主鍵,要麼把分區字段加入到主鍵中,從而形成複合主鍵。
2.修改sql:
CREATE TABLE `bonc_test`.`user_login_tb` (
`user_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) NOT NULL,
`ip` varchar(255) NOT NULL,
`login_time` datetime(0) NOT NULL,
PRIMARY KEY (`user_id`,login_time)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8
partition by RANGE(YEAR(login_time))(
partition p0 values less than(2014),
partition p1 values less than(2015),
partition p2 values less than(2017)
);
3.添加數據:
insert into user_login_tb(user_id,user_name,ip,login_time) values(111,'bb','192.168.23.4','2012-08-02')
insert into user_login_tb(user_id,user_name,ip,login_time) values(112,'bb','192.168.23.4','2013-08-02')
insert into user_login_tb(user_id,user_name,ip,login_time) values(113,'bb','192.168.23.4','2014-08-02')
insert into user_login_tb(user_id,user_name,ip,login_time) values(null,'bb','192.168.23.4','2014-08-02')
insert into user_login_tb(user_id,user_name,ip,login_time) values(null,'bb','192.168.23.4','2015-08-02')
insert into user_login_tb(user_id,user_name,ip,login_time) values(null,'bb','192.168.23.4','2016-07-02')
4.查看分區信息:
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,
TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='user_login_tb';
5.新增一條大於分區的數據:可以看到大於分區的數據,無法添加進去。
insert into user_login_tb(user_id,user_name,ip,login_time) values(null,'bb','192.168.23.4','2018-07-02')
6.新增分區
我們可以使用alter table tablename add partition 方式再最後面添加分區
#1.新添加分區
alter table user_login_tb add partition(partition p3 values less than(2019));
#2.查看分區:
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,
TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='user_login_tb';
3.新添加數據
insert into user_login_tb(user_id,user_name,ip,login_time) values(null,'bb','192.168.23.4','2018-07-02')
4.再次查看
7.刪除分區
#刪除分區
alter table user_login_tb drop partition p1;
8.分區遷移
alter table user_login_tb exchange partition p2 with table arch_login_log
如果user_login_tb 表中p2分區爲空,則交換到arch_login_log中的數據進行更新,覆蓋掉原來的數據,要慎用。