MySQL分区表
1.Range分区
最常用的一种分区方式
比如按照日期进行分区
CREATE TABLE award_gift_record (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`NickName` varchar(100) NOT NULL DEFAULT '',
`AwardGiftID` int(11) NOT NULL DEFAULT '-1' COMMENT '礼物ID',
`ActionTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`,`ActionTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='抽奖记录表'
partition by range(UNIX_TIMESTAMP(ActionTime))
(
partition p201506 VALUES LESS THAN(UNIX_TIMESTAMP('2015-06-01 00:00:00')),
partition p201507 VALUES LESS THAN(UNIX_TIMESTAMP('2015-07-01 00:00:00')),
partition p201508 VALUES LESS THAN(UNIX_TIMESTAMP('2015-08-01 00:00:00'))
);
增加分区
alter table award_gift_record ADD PARTITION (PARTITION p201509 VALUES LESS THAN (UNIX_TIMESTAMP('2015-09-01 00:00:00')));
alter table award_gift_record ADD PARTITION (PARTITION pmax VALUES LESS THAN MAXVALUE);
删除分区
alter table award_gift_record DROP PARTITION p201506;
2.List分区
CREATE TABLE award_gift_record (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`NickName` varchar(100) NOT NULL DEFAULT '',
`AwardGiftID` int(11) NOT NULL DEFAULT '-1' COMMENT '礼物ID',
`ActionTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`,`AwardGiftID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='抽奖记录表'
partition by list(AwardGiftID)
(
partition p0 values in (0),
partition p1_3 values in (1,2,3)
);
增加分区
alter table award_gift_record ADD PARTITION (PARTITION p4_6 values in (4,5,6));
alter table award_gift_record ADD PARTITION (PARTITION pnull VALUES in (null));
删除分区
alter table award_gift_record DROP PARTITION p0;
3.Hash分区
自定义函数进行Hash分区
CREATE TABLE award_gift_record (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`NickName` varchar(100) NOT NULL DEFAULT '',
`AwardGiftID` int(11) NOT NULL DEFAULT '-1' COMMENT '礼物ID',
`ActionTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`,`ActionTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='抽奖记录表'
partition by hash(UNIX_TIMESTAMP(ActionTime))
partitions 6;
4.Key分区
使用MySQL内部的散列函数
CREATE TABLE award_gift_record (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`NickName` varchar(100) NOT NULL DEFAULT '',
`AwardGiftID` int(11) NOT NULL DEFAULT '-1' COMMENT '礼物ID',
`ActionTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`,`AwardGiftID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='抽奖记录表'
partition by key(AwardGiftID)
partitions 6;
5.Columns分区
前面四种分区类型,分区的条件必须是整形,如果字段不是整形,则通过函数进行转化。
MySQL 5.5开始支持Columns分区,可以使用非整形字段进行分区.
Columns分区支持一下数据类型
所有的整形(INT,SMALLINT,TINYINT,BIGINT)
日期类型(DATE,DATETIME) 注意时间戳类型是不支持的,时间戳需要使用Range分区
字符串类型(CHAR,VARCHAR,BINARY,VARBINARY) BLOB,TEXT类型不支持
CREATE TABLE award_gift_record (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`NickName` varchar(100) NOT NULL DEFAULT '',
`AwardGiftID` int(11) NOT NULL DEFAULT '-1' COMMENT '礼物ID',
`ActionTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`,`ActionTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='抽奖记录表'
partition by range columns(ActionTime)
(
partition p201506 values less than ('2015-06-01'),
partition p201507 values less than ('2015-07-01')
);
CREATE TABLE award_gift_record (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`NickName` varchar(100) NOT NULL DEFAULT '',
`AwardGiftID` int(11) NOT NULL DEFAULT '-1' COMMENT '礼物ID',
`ActionTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`,`NickName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='抽奖记录表'
partition by list columns(NickName)
(
partition pa values in ('a','b','c')
);
6.子分区
MySQL数据库可以在Range和List分区的基础上,再进行Hash或者Key的子分区。
子分区好像没有想象中的那么有用..
分区中的null值
MySQL数据库分区总是把null值视为小于任何一个非空值。
Range分区,null值作为最小的值,放入第一个分区.
List分区,需要有null的列表,否则插入报错.
alter table award_gift_record ADD PARTITION (PARTITION pnull VALUES in (null));
Hash,Key分区
null值作为0处理
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-1709895/,如需转载,请注明出处,否则将追究法律责任。