本節討論 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 中,根據 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 8.4 中,也可以使用 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 陳述式」。