【mysql分区分表】mysql 按时间分区 【partition】
大家好,我是烤鴨:
?? ?今天分享一下有關 mysql 分區。
需求:
? ? ? 按時間分區。 對千萬數據左右的表,進行分區,數據的增加量大概千萬/年。
代碼實現:
?模擬之前已經存在的表:
DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ?(`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',`description` varchar(512) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`state` tinyint(4) NULL DEFAULT 0 COMMENT '0:未處理,1:處理中,2:處理完成,3:異常訂單',`create_time` datetime(0) NULL DEFAULT NULL COMMENT '創建時間' ) ;? #取消自增
alter table test modify id int;?#刪除主鍵
alter table test drop PRIMARY KEY;?#添加復合主鍵
alter table test add PRIMARY KEY(id,create_time);?#id 改為自增
alter table test modify ?id int AUTO_INCREMENT;?#增加組合索引,分區的字段必須是唯一,所以唯一索引無法創建。
#ALTER TABLE test ADD UNIQUE (serial_no,delete_flag);?#增加分區,按時間 1 年
ALTER TABLE test PARTITION BY RANGE COLUMNS(create_time ) (PARTITION p1 VALUES LESS THAN ( '20190101'),PARTITION p2 VALUES LESS THAN ( '20200101'),PARTITION p3 VALUES LESS THAN ( '20210101'),PARTITION p4 VALUES LESS THAN ( '20220101'),PARTITION p5 VALUES LESS THAN ( '20230101'),PARTITION p6 VALUES LESS THAN ( '20240101'),PARTITION p7 VALUES LESS THAN ( '20250101'),PARTITION p8 VALUES LESS THAN ( '20260101'),PARTITION p9 VALUES LESS THAN ( '20270101') );簡單介紹:
mysql分區類型
?? ?RANGE 分區:
?? ??? ?基于屬于一個給定連續區間的列值,把多行分配給分區。
?? ?LIST 分區:
?? ??? ?類似于按RANGE分區,區別在于LIST分區是基于列值匹配一個離散值集合中的某個值來進行選擇。
?? ?HASH分區:
?? ??? ?基于用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL中有效的、產生非負整數值的任何表達式。
?? ?KEY分區:
? ? ? ? 類似于按HASH分區,區別在于KEY分區只支持計算一列或多列,且MySQL服務器提供其自身的哈希函數。必須有一列或多列包含整數值。
?? ?復合分區:
?? ??? ?基于RANGE/LIST 類型的分區表中每個分區的再次分割。子分區可以是 HASH/KEY 等類型。
常用的命令:
?#創建表時分區:
CREATE TABLE `test` ?(`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',`description` varchar(512) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`state` tinyint(4) NULL DEFAULT 0 COMMENT '0:未處理,1:處理中,2:處理完成,3:異常訂單',`create_time` datetime(0) NULL DEFAULT NULL COMMENT '創建時間',PRIMARY KEY (`id`) USING BTREE,INDEX `etc_cg_document_i4`(`state`) USING BTREE, ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact PARTITION BY RANGE (`id`)PARTITIONS 2(PARTITION `p1` VALUES LESS THAN (10000) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,PARTITION `p2` VALUES LESS THAN (20000) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ) ;?#增加分區:(以id分區)
alter table test partition by range(id) (partition p1 values less than (10000),partition p2 values less than (20000) );?#刪除指定分區:
alter table test drop partition p1;?#刪除所有分區:
Alter table test remove partitioning;????? #查看分區信息
SELECTPARTITION_NAME,TABLE_ROWS? FROMINFORMATION_SCHEMA.PARTITIONS? WHERETABLE_NAME = 'test';另外說下,如果刪除分區,指定分區的數據也會同步刪除,謹慎操作。
如果想mysql重建表分區并保留數據的的話,參考這篇:
https://blog.csdn.net/fdipzone/article/details/79769524
關于大數據量 mysql 優化看這篇:
https://blog.csdn.net/afsvsv/article/details/84998119
關于更多 mysql 分區的信息 看這篇文章:
https://www.cnblogs.com/sweet521/p/6439598.html
總結
以上是生活随笔為你收集整理的【mysql分区分表】mysql 按时间分区 【partition】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI CC2017安装后,安装目录里找不
- 下一篇: MySQL操作权限整理