列表列分区
MySQL 5.7支持列表列分区。这是列表分区的一个变体,允许使用多个列作为分区键,并允许非整数类型的数据类型用作分区列;你可以使用字 符串类型、DATE和DATETIME列。
使用列表列分区,用户可以为客户数据创建一个表,根据客户所在城市的名称,将一行分配给对应于这些区域的4个分区中的任何一个,如下所示:
mysql> CREATE TABLE customers_1 (
-> first_name VARCHAR(25),
-> last_name VARCHAR(25),
-> street_1 VARCHAR(30),
-> street_2 VARCHAR(30),
-> city VARCHAR(15),
-> renewal DATE
-> )
-> PARTITION BY LIST COLUMNS(city) (
-> PARTITION pRegion_1 VALUES IN('Oskarshamn', 'H?gsby', 'M?nster?s'),
-> PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'V?stervik'),
-> PARTITION pRegion_3 VALUES IN('N?ssj?', 'Eksj?', 'Vetlanda'),
-> PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'V?xjo')
-> );
Query OK, 0 rows affected (0.04 sec)
与按范围分区列一样,你不需要在COLUMNS()子句中使用表达式将列值转换为整数。(实际上,COLUMNS()不允许使用列名以外的表达式。)
也可以使用DATE和DATETIME列,如下面的例子所示,它们的名称和列与之前的customers_1表相同,但使用基于renew列的列表列分区将行存储在 4个分区中的一个中,具体取决于2010年2月客户账户计划更新的那一周:
mysql> CREATE TABLE customers_2 (
-> first_name VARCHAR(25),
-> last_name VARCHAR(25),
-> street_1 VARCHAR(30),
-> street_2 VARCHAR(30),
-> city VARCHAR(15),
-> renewal DATE
-> )
-> PARTITION BY LIST COLUMNS(renewal) (
-> PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03',
-> '2010-02-04', '2010-02-05', '2010-02-06', '2010-02-07'),
-> PARTITION pWeek_2 VALUES IN('2010-02-08', '2010-02-09', '2010-02-10',
-> '2010-02-11', '2010-02-12', '2010-02-13', '2010-02-14'),
-> PARTITION pWeek_3 VALUES IN('2010-02-15', '2010-02-16', '2010-02-17',
-> '2010-02-18', '2010-02-19', '2010-02-20', '2010-02-21'),
-> PARTITION pWeek_4 VALUES IN('2010-02-22', '2010-02-23', '2010-02-24',
-> '2010-02-25', '2010-02-26', '2010-02-27', '2010-02-28')
-> );
Query OK, 0 rows affected (0.02 sec)
这是可行的,但如果涉及的日期数量非常大,则定义和维护起来就很麻烦。在这种情况下,采用范围或范围列分区通常更实用。在本例中,由于 我们希望用作分区键的列是日期列,所以我们使用范围列分区,如下所示:
mysql> CREATE TABLE customers_3 (
-> first_name VARCHAR(25),
-> last_name VARCHAR(25),
-> street_1 VARCHAR(30),
-> street_2 VARCHAR(30),
-> city VARCHAR(15),
-> renewal DATE
-> )
-> PARTITION BY RANGE COLUMNS(renewal) (
-> PARTITION pWeek_1 VALUES LESS THAN('2010-02-09'),
-> PARTITION pWeek_2 VALUES LESS THAN('2010-02-15'),
-> PARTITION pWeek_3 VALUES LESS THAN('2010-02-22'),
-> PARTITION pWeek_4 VALUES LESS THAN('2010-03-01')
-> );
Query OK, 0 rows affected (0.03 sec)
此外(与范围列分区一样),你可以在COLUMNS()子句中使用多个列。