MySQL 8.4 參考手冊  /  分割  /  分割類型

26.2 分割類型

本節討論 MySQL 8.4 中可用的分割類型。這些包括此處列出的類型

  • 範圍分割。 這種分割類型根據欄位值落在給定範圍內將列分配到分割區。請參閱 第 26.2.1 節,「範圍分割」。有關此類型擴充功能 RANGE COLUMNS 的資訊,請參閱 第 26.2.3.1 節,「範圍欄分割」

  • 列表分割。 類似於按 RANGE 分割,不同之處在於,分割區是根據符合一組離散值的欄位來選擇的。請參閱 第 26.2.2 節,「列表分割」。有關此類型擴充功能 LIST COLUMNS 的資訊,請參閱 第 26.2.3.2 節,「列表欄分割」

  • 雜湊分割。 使用這種分割類型,會根據使用者定義的運算式所傳回的值來選擇分割區,該運算式會對要插入到表格中的列中的欄位值進行運算。該函數可以包含任何在 MySQL 中有效的運算式,並且會產生一個整數值。請參閱 第 26.2.4 節,「雜湊分割」

    此類型的擴充功能 LINEAR HASH 也可用,請參閱 第 26.2.4.1 節,「線性雜湊分割」

  • 金鑰分割。 這種分割類型類似於按 HASH 分割,不同之處在於,僅提供一個或多個要評估的欄位,並且 MySQL 伺服器提供自己的雜湊函數。這些欄位可以包含整數值以外的其他值,因為 MySQL 提供的雜湊函數保證無論欄位資料類型為何都會產生整數結果。此類型的擴充功能 LINEAR KEY 也可用。請參閱 第 26.2.5 節,「金鑰分割」

資料庫分割的一個非常常見的用途是按日期分隔資料。一些資料庫系統支援明確的日期分割,MySQL 在 8.4 中沒有實作。但是,在 MySQL 中,根據 DATETIMEDATETIME 欄位建立分割配置,或根據使用此類欄位的運算式建立分割配置並不困難。

當按 KEYLINEAR KEY 分割時,您可以使用 DATETIMEDATETIME 欄位作為分割欄位,而無需對欄位值執行任何修改。例如,這個建立表格的陳述式在 MySQL 中完全有效

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY KEY(joined)
PARTITIONS 6;

在 MySQL 8.4 中,也可以使用 DATEDATETIME 欄位作為使用 RANGE COLUMNSLIST COLUMNS 分割的分割欄位。

其他分割類型需要產生整數值或 NULL 的分割運算式。如果您希望按 RANGELISTHASHLINEAR HASH 使用基於日期的分割,您可以簡單地採用一個對 DATETIMEDATETIME 欄位進行運算並傳回此類值的函數,如下所示

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
    PARTITION p0 VALUES LESS THAN (1960),
    PARTITION p1 VALUES LESS THAN (1970),
    PARTITION p2 VALUES LESS THAN (1980),
    PARTITION p3 VALUES LESS THAN (1990),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);

有關使用日期的分割的其他範例可以在本章的以下章節中找到

有關基於日期的分割的更複雜範例,請參閱以下章節

MySQL 分割已最佳化,可與 TO_DAYS()YEAR()TO_SECONDS() 函數搭配使用。但是,您可以使用其他傳回整數或 NULL 的日期和時間函數,例如 WEEKDAY()DAYOFYEAR()MONTH()。請參閱 第 14.7 節,「日期和時間函數」,以取得有關此類函數的更多資訊。

重要的是要記住,無論您使用何種類型的分割,分割區在建立時總是會自動且依序編號,從 0 開始。當將新列插入分割表格時,這些分割區編號將用於識別正確的分割區。例如,如果您的表格使用 4 個分割區,則這些分割區的編號為 0123。對於 RANGELIST 分割類型,必須確保為每個分割區編號定義一個分割區。對於 HASH 分割,使用者提供的運算式必須評估為整數值。對於 KEY 分割,此問題會由 MySQL 伺服器在內部使用的雜湊函數自動處理。

分割區的名稱通常遵循管理其他 MySQL 識別碼的規則,例如表格和資料庫的規則。但是,您應該注意,分割區名稱不區分大小寫。例如,以下 CREATE TABLE 陳述式會失敗,如下所示

mysql> CREATE TABLE t2 (val INT)
    -> PARTITION BY LIST(val)(
    ->     PARTITION mypart VALUES IN (1,3,5),
    ->     PARTITION MyPart VALUES IN (2,4,6)
    -> );
ERROR 1488 (HY000): Duplicate partition name mypart

之所以發生失敗,是因為 MySQL 認為分割區名稱 mypartMyPart 之間沒有區別。

當您為表格指定分割區的數量時,必須將其表示為正的非零整數常值,且沒有前導零,並且可能不是像 0.8E+016-2 這樣的運算式,即使它評估為整數值。不允許使用小數。

在以下章節中,我們不一定會提供可用於建立每個分割類型的語法的所有可能形式;有關此資訊,請參閱 第 15.1.20 節,「CREATE TABLE 陳述式」