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

26.2 分割類型

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

  • 範圍分割。 此分割類型根據欄位值落入給定範圍,將列分配到分割區。請參閱第 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 在 9.0 中沒有實作。不過,在 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 9.0 中,也可以使用 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 陳述式」