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';