日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【mysql分区分表】mysql 按时间分区 【partition】

發布時間:2023/12/10 数据库 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。