MySQL 8.4 提供對 LIST COLUMNS
分割的支援。這是 LIST
分割的一種變體,它允許使用多個資料行作為分割鍵,並允許使用整數類型以外的資料類型資料行作為分割資料行;您可以使用字串類型、DATE
和 DATETIME
資料行。(如需關於 COLUMNS
分割資料行允許的資料類型的更多資訊,請參閱第 26.2.3 節,「COLUMNS 分割」。)
假設您有一家企業,在 12 個城市有客戶,為了銷售和行銷目的,您將它們分為 4 個區域,每個區域 3 個城市,如下表所示
區域 | 城市 |
---|---|
1 | 奧斯卡港、霍格斯比、門斯特羅斯 |
2 | 維默比、胡爾茨弗雷德、韋斯特維克 |
3 | 奈斯舍、埃克斯舍、韋特蘭達 |
4 | 烏普維丁厄、阿爾韋斯塔、韋克舍 |
使用 LIST COLUMNS
分割,您可以建立一個客戶資料表格,根據客戶居住的城市名稱,將一列資料分配到與這些區域對應的 4 個分割區中的任何一個,如下所示
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')
);
與使用 RANGE COLUMNS
分割一樣,您不需要在 COLUMNS()
子句中使用運算式將資料行值轉換為整數。(事實上,除了資料行名稱以外的運算式,不允許用於 COLUMNS()
。)
也可以使用 DATE
和 DATETIME
資料行,如下列範例所示,該範例使用與先前顯示的 customers_1
表格相同的名稱和資料行,但使用基於 renewal
資料行的 LIST COLUMNS
分割,根據客戶帳戶計劃於 2010 年 2 月的哪個星期續約,將資料列儲存在 4 個分割區之一中
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')
);
這可行,但如果涉及的日期數量非常龐大,定義和維護會變得繁瑣;在這種情況下,通常更實際的做法是改為採用 RANGE
或 RANGE COLUMNS
分割。在這個案例中,由於我們想要用作分割鍵的資料行是 DATE
資料行,我們使用 RANGE COLUMNS
分割,如下所示
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')
);
如需更多資訊,請參閱第 26.2.3.1 節,「RANGE COLUMNS 分割」。
此外(與 RANGE COLUMNS
分割一樣),您可以在 COLUMNS()
子句中使用多個資料行。
如需關於 PARTITION BY LIST COLUMNS()
語法的更多資訊,請參閱第 15.1.20 節,「CREATE TABLE 陳述式」。