MySQL 8.4 參考手冊  /  ...  /  LIST COLUMNS 分割

26.2.3.2 LIST COLUMNS 分割

MySQL 8.4 提供對 LIST COLUMNS 分割的支援。這是 LIST 分割的一種變體,它允許使用多個資料行作為分割鍵,並允許使用整數類型以外的資料類型資料行作為分割資料行;您可以使用字串類型、DATEDATETIME 資料行。(如需關於 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()。)

也可以使用 DATEDATETIME 資料行,如下列範例所示,該範例使用與先前顯示的 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')
);

這可行,但如果涉及的日期數量非常龐大,定義和維護會變得繁瑣;在這種情況下,通常更實際的做法是改為採用 RANGERANGE 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 陳述式」