mysql的分區:使用range分區

一.概念

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中的數據進行更新,覆蓋掉原來的數據,要慎用。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章