MySQL 分区表


一、数据库表分区

1、横向分区

把数据库表横向分为几块。举例来说,如果一个表有100万条记录,横向分区就可以把表分成10块,每块有个10万条数据。

2、纵向分区

把有多个列的表分为几个表。比如一个表有20列,可以把这个表分为两个表,每个表10列 – 这两个表还应该有外键关联。

二、MySQL 分区功能

MySQL 的 PARTITION 关键字支持横向分区。

1、range

基于属于一个给定连续区间的列值,把多行分配给分区。

  • 插入数据时,如果区间没有包含分区的列值时会报错。
CREATE TABLE `trb3` (
  `id` int(11) default NULL,
  `name` varchar(50) default NULL,
  `purchased` date default NULL
) ENGINE=MyISAM
PARTITION BY RANGE (YEAR(purchased)) (
  PARTITION p0 VALUES LESS THAN (1990) ENGINE = MyISAM,
  PARTITION p1 VALUES LESS THAN (1995) ENGINE = MyISAM,
  PARTITION p2 VALUES LESS THAN (2000) ENGINE = MyISAM,
  PARTITION p3 VALUES LESS THAN (2005) ENGINE = MyISAM
)

要注意的一点是 CREATE TABLEPARTITION 是在一个语句里,中间没有分号隔开。

2、list

类似于 range,区别在于 list 分区是基于列值匹配一个离散值集合中的某个值进行选择。

  • 插入数据时,如果区间没有包含分区的列值时会报错。
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LIST(store_id)
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
)

3、hash

基于用户定义的表达式的返回值(整数)进行分区,该表达式使用将要插入到表中的这些行的列值进行计算。

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4
  • PARTITIONS 没有时默认分区是1

4、key

类似于 hash。区别在于 key 分区只支持计算一列或多列,且 MySQL 服务器提供自身的哈希函数。

CREATE TABLE tk (
    col1 INT NOT NULL,
    col2 CHAR(5),
    col3 DATE
) 
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;