分區有range 分區、list 分區、hash 分區、key 分區。
分區的限制:1.主鍵/唯一鍵必須包含分區鍵,且沒有列前要求
2.分區名不區分大小寫 /*一般情況下由於MySQL數據庫和表對應系統中的文件和目錄,所以大小寫敏感問題取決於系統*/
range 分區:基於一個給定的連續範圍進行分區
range分區的限制:
1.區間連續且不能重疊
2.range分區要求分區鍵是整數類型,如果需要使用其他類型,需要使用range columns分區,否則只能使用函數處理轉化爲整型
用法:
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`ttime` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
PARTITION BY RANGE COLUMNS(ttime)
(PARTITION p0 VALUES LESS THAN ('2017-01-01') ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN ('2017-02-01') ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN maxvalues ENGINE = InnoDB) ;
(maxvalues 表示最大的可能的整數值)
range 分區的應用場景:
1.需要刪除過期的數據時,alter table t drop partition p0。(效率比delete快)
2.運行包括分區鍵的範圍查詢。(可以快速確定要查詢的分區,掃描少量分區即可得到查詢結果)
list 分區:基於枚舉出的值列表分區
list 分區的限制:
1.list分區要求分區鍵是整數類型,如果需要使用其他類型可以使用list columns分區
用法:
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
PARTITION BY LIST (id)
(PARTITION p0 VALUES IN (1,3,10) ENGINE = InnoDB,
PARTITION p1 VALUES IN (2,5,12) ENGINE = InnoDB,
PARTITION p2 VALUES IN (9,6,4) ENGINE = InnoDB) ;
查看分區情況:(查看information_schema.partitions表)
mysql> select partition_name,partition_expression,partition_description from partitions where table_name='t';
+----------------+----------------------+-----------------------+
| partition_name | partition_expression | partition_description |
+----------------+----------------------+-----------------------+
| p0 | `name` | '1q','3a','4l' |
| p1 | `name` | 'a2','5','6' |
+----------------+----------------------+-----------------------+
2 rows in set (0.00 sec)
hash 分區:基於給定的分區的數目,將數據分佈到不同的分區
hash分區根據分配的算法的不一樣分爲常規hash分區和線性hash分區
hash分區的限制:只支持分區鍵爲整數的分區
hash 分區應用場景:用來分散熱點讀,使數據在預先設置的幾個分區儘量平均分佈
語法:
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
PARTITION BY HASH (id)
PARTITIONS 3 ;
key 分區:類似hash分區,但是key支持出test,blob之外的所有數據類型做分區鍵
語法:
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
PARTITION BY KEY (`name`)
PARTITIONS 3 ;
複合分區:分區表中對每一個分區的再次分割。
複合分區適用於保存非常大量的數據記錄。
用法:
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
PARTITION BY RANGE COLUMNS(id)
SUBPARTITION BY HASH (id)
SUBPARTITIONS 2
(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (20) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB);
綜上,range、list都使用range column、list column來代替。