MySQL 5.7 列表列分区

列表列分区
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()子句中使用多个列。

发表评论

电子邮件地址不会被公开。