ITPub博客

首页 > 数据库 > MySQL > MySQL分区表

MySQL分区表

原创 MySQL 作者:壹頁書 时间:2015-06-24 01:06:54 0 删除 编辑
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博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1709895/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6340755