本節討論 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 中建立基於DATE
、TIME
或 DATETIME
欄位,或是基於使用這些欄位的表達式的分割配置並不困難。
以 KEY
或 LINEAR KEY
分割時,您可以使用 DATE
、TIME
或 DATETIME
欄位作為分割欄位,而無需修改欄位值。例如,此表格建立陳述式在 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 中,也可以使用 DATE
或 DATETIME
欄位作為使用 RANGE COLUMNS
和 LIST COLUMNS
分割的分割欄位。
其他分割類型需要產生整數值或 NULL
的分割表達式。如果您希望使用基於日期的 RANGE
、LIST
、HASH
或 LINEAR HASH
分割,您只需使用在 DATE
、TIME
或 DATETIME
欄位上運作並傳回此類值的函數即可,如下所示
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 個分割區,則這些分割區的編號為 0
、1
、2
和 3
。對於 RANGE
和 LIST
分割類型,必須確保為每個分割區號碼定義一個分割區。對於 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 看不出分割區名稱 mypart
和 MyPart
之間有任何差異。
當您指定表格的分割區數量時,必須將其表示為正數、非零整數字面值,且不能有前導零,並且不能是表達式,例如 0.8E+01
或 6-2
,即使它評估為整數值。不允許使用十進位分數。
在接下來的章節中,我們不一定會提供可供用於建立每個分割類型語法的所有可能形式;如需此資訊,請參閱第 15.1.20 節,「CREATE TABLE 陳述式」。