MySQL分割槽表

壹頁書發表於2015-06-24
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章