mysql創建分區

mysql分區相對於mysql分庫分表便利很多,可以對現有的mysql大表添加分區,也可以對已有分區的表擴充分區。

mysql分區常用處理數據邊界清晰的案列,入財務報表數據,我們可以按月對報表數據進行分區。

值得注意的是我們再用sql查詢時,必須加上開始時間和結束時間的查詢條件,將查詢區間限制到相應的分區,否則會遍歷所有分區。

一、如下案例:我們通過時間字段按月對錶數據進行分區創建sql如下:

CREATE TABLE `test_all_summary` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `cost_type` int(2) DEFAULT NULL COMMENT '類型',
 `orderid` bigint(18) DEFAULT '0' COMMENT '單號',
   `all_amount` bigint(18) DEFAULT '0' COMMENT '總金額',
  `start_tm` date NOT NULL COMMENT '日期',
  PRIMARY KEY (`id`,`start_tm`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='表'
/*!50100 PARTITION BY RANGE (to_days(start_tm))
(PARTITION p201904 VALUES LESS THAN (737515) ENGINE = InnoDB,
 PARTITION p201905 VALUES LESS THAN (737545) ENGINE = InnoDB,
 PARTITION p201906 VALUES LESS THAN (737576) ENGINE = InnoDB,
 PARTITION p201907 VALUES LESS THAN (737606) ENGINE = InnoDB,
 PARTITION p201908 VALUES LESS THAN (737637) ENGINE = InnoDB,
 PARTITION p201909 VALUES LESS THAN (737668) ENGINE = InnoDB,
 PARTITION p201910 VALUES LESS THAN (737698) ENGINE = InnoDB,
 PARTITION p201911 VALUES LESS THAN (737729) ENGINE = InnoDB,
 PARTITION p201912 VALUES LESS THAN (737759) ENGINE = InnoDB,
 PARTITION p202001 VALUES LESS THAN (737790) ENGINE = InnoDB,
 PARTITION p202002 VALUES LESS THAN (737821) ENGINE = InnoDB,
 PARTITION p202003 VALUES LESS THAN (737850) ENGINE = InnoDB,
 PARTITION p202004 VALUES LESS THAN (737881) ENGINE = InnoDB,
 PARTITION p202005 VALUES LESS THAN (737911) ENGINE = InnoDB,
 PARTITION p202006 VALUES LESS THAN (737942) ENGINE = InnoDB,
 PARTITION p202007 VALUES LESS THAN (737972) ENGINE = InnoDB,
 PARTITION p202008 VALUES LESS THAN (738003) ENGINE = InnoDB,
 PARTITION p202009 VALUES LESS THAN (738034) ENGINE = InnoDB,
 PARTITION p202010 VALUES LESS THAN (738064) ENGINE = InnoDB,
 PARTITION p202011 VALUES LESS THAN (738095) ENGINE = InnoDB,
 PARTITION p202012 VALUES LESS THAN (738125) ENGINE = InnoDB,
 PARTITION p202101 VALUES LESS THAN (738156) ENGINE = InnoDB,
 PARTITION p202102 VALUES LESS THAN (738187) ENGINE = InnoDB,
 PARTITION p202103 VALUES LESS THAN (738215) ENGINE = InnoDB,
 PARTITION p202104 VALUES LESS THAN (738246) ENGINE = InnoDB,
 PARTITION p202105 VALUES LESS THAN (738276) ENGINE = InnoDB,
 PARTITION p202106 VALUES LESS THAN (738307) ENGINE = InnoDB,
 PARTITION p202107 VALUES LESS THAN (738337) ENGINE = InnoDB,
 PARTITION p202108 VALUES LESS THAN (738368) ENGINE = InnoDB,
 PARTITION p202109 VALUES LESS THAN (738399) ENGINE = InnoDB,
 PARTITION p202110 VALUES LESS THAN (738429) ENGINE = InnoDB,
 PARTITION p202111 VALUES LESS THAN (738460) ENGINE = InnoDB,
 PARTITION p202112 VALUES LESS THAN (738490) ENGINE = InnoDB,
 PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */

分區數據展示如下,表中我是按月對錶數據進行分區的,表中的描述字段是數據庫時間按天換算的有需要的可以自取: 

 

二、刪除分區

 alter table test_all_summary drop PARTITION pmax ;

三、擴充分區,再原有分區的表上擴分區,需要刪除原表中最大的分區。

 alter table test_all_summary drop PARTITION pmax ;

alter TABLE `test_all_summary` add PARTITION(
 PARTITION p202001 VALUES LESS THAN (737790) ENGINE = InnoDB,
 PARTITION p202002 VALUES LESS THAN (737821) ENGINE = InnoDB,
 PARTITION p202003 VALUES LESS THAN (737850) ENGINE = InnoDB,
 PARTITION p202004 VALUES LESS THAN (737881) ENGINE = InnoDB,
 PARTITION p202005 VALUES LESS THAN (737911) ENGINE = InnoDB,
 PARTITION p202006 VALUES LESS THAN (737942) ENGINE = InnoDB,
 PARTITION p202007 VALUES LESS THAN (737972) ENGINE = InnoDB,
 PARTITION p202008 VALUES LESS THAN (738003) ENGINE = InnoDB,
 PARTITION p202009 VALUES LESS THAN (738034) ENGINE = InnoDB,
 PARTITION p202010 VALUES LESS THAN (738064) ENGINE = InnoDB,
 PARTITION p202011 VALUES LESS THAN (738095) ENGINE = InnoDB,
 PARTITION p202012 VALUES LESS THAN (738125) ENGINE = InnoDB,
 PARTITION p202101 VALUES LESS THAN (738156) ENGINE = InnoDB,
 PARTITION p202102 VALUES LESS THAN (738187) ENGINE = InnoDB,
 PARTITION p202103 VALUES LESS THAN (738215) ENGINE = InnoDB,
 PARTITION p202104 VALUES LESS THAN (738246) ENGINE = InnoDB,
 PARTITION p202105 VALUES LESS THAN (738276) ENGINE = InnoDB,
 PARTITION p202106 VALUES LESS THAN (738307) ENGINE = InnoDB,
 PARTITION p202107 VALUES LESS THAN (738337) ENGINE = InnoDB,
 PARTITION p202108 VALUES LESS THAN (738368) ENGINE = InnoDB,
 PARTITION p202109 VALUES LESS THAN (738399) ENGINE = InnoDB,
 PARTITION p202110 VALUES LESS THAN (738429) ENGINE = InnoDB,
 PARTITION p202111 VALUES LESS THAN (738460) ENGINE = InnoDB,
 PARTITION p202112 VALUES LESS THAN (738490) ENGINE = InnoDB,
 PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB
);

四、對沒有分區的表添加分區,緩解表數據壓力,注意分區表字段需要參與建立聯合唯一索引。

已有表添加分區

alter table `table` partition by range(to_days(start_tm))(
 PARTITION p201904 VALUES LESS THAN (737515) ENGINE = InnoDB,
 PARTITION p201905 VALUES LESS THAN (737545) ENGINE = InnoDB,
 PARTITION p201906 VALUES LESS THAN (737576) ENGINE = InnoDB,
 PARTITION p201907 VALUES LESS THAN (737606) ENGINE = InnoDB,
 PARTITION p201908 VALUES LESS THAN (737637) ENGINE = InnoDB,
 PARTITION p201909 VALUES LESS THAN (737668) ENGINE = InnoDB,
 PARTITION p201910 VALUES LESS THAN (737698) ENGINE = InnoDB,
 PARTITION p201911 VALUES LESS THAN (737729) ENGINE = InnoDB,
 PARTITION p201912 VALUES LESS THAN (737759) ENGINE = InnoDB,
 PARTITION p202001 VALUES LESS THAN (737790) ENGINE = InnoDB,
 PARTITION p202002 VALUES LESS THAN (737821) ENGINE = InnoDB,
 PARTITION p202003 VALUES LESS THAN (737850) ENGINE = InnoDB,
 PARTITION p202004 VALUES LESS THAN (737881) ENGINE = InnoDB,
 PARTITION p202005 VALUES LESS THAN (737911) ENGINE = InnoDB,
 PARTITION p202006 VALUES LESS THAN (737942) ENGINE = InnoDB,
 PARTITION p202007 VALUES LESS THAN (737972) ENGINE = InnoDB,
 PARTITION p202008 VALUES LESS THAN (738003) ENGINE = InnoDB,
 PARTITION p202009 VALUES LESS THAN (738034) ENGINE = InnoDB,
 PARTITION p202010 VALUES LESS THAN (738064) ENGINE = InnoDB,
 PARTITION p202011 VALUES LESS THAN (738095) ENGINE = InnoDB,
 PARTITION p202012 VALUES LESS THAN (738125) ENGINE = InnoDB,
 PARTITION p202101 VALUES LESS THAN (738156) ENGINE = InnoDB,
 PARTITION p202102 VALUES LESS THAN (738187) ENGINE = InnoDB,
 PARTITION p202103 VALUES LESS THAN (738215) ENGINE = InnoDB,
 PARTITION p202104 VALUES LESS THAN (738246) ENGINE = InnoDB,
 PARTITION p202105 VALUES LESS THAN (738276) ENGINE = InnoDB,
 PARTITION p202106 VALUES LESS THAN (738307) ENGINE = InnoDB,
 PARTITION p202107 VALUES LESS THAN (738337) ENGINE = InnoDB,
 PARTITION p202108 VALUES LESS THAN (738368) ENGINE = InnoDB,
 PARTITION p202109 VALUES LESS THAN (738399) ENGINE = InnoDB,
 PARTITION p202110 VALUES LESS THAN (738429) ENGINE = InnoDB,
 PARTITION p202111 VALUES LESS THAN (738460) ENGINE = InnoDB,
 PARTITION p202112 VALUES LESS THAN (738490) ENGINE = InnoDB,
 PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB
);

五、查詢分區,各區表數據量。

SELECT PARTITION_NAME,TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'table';

 

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