依鍵值進行分區與依雜湊進行分區類似,不同之處在於雜湊分區使用使用者定義的運算式,而鍵值分區的雜湊函數則由 MySQL 伺服器提供。NDB Cluster 為此目的使用 MD5()
;對於使用其他儲存引擎的資料表,伺服器會使用其內部雜湊函數。
CREATE TABLE ... PARTITION BY KEY
的語法規則與建立依雜湊分區的資料表的規則類似。主要差異如下所列
使用
KEY
而不是HASH
。KEY
僅採用零個或多個欄位名稱的列表。任何用作分區鍵的欄位必須包含資料表主鍵的部分或全部,如果資料表有主鍵。如果未指定任何欄位名稱作為分區鍵,則使用資料表的主鍵(如果有的話)。例如,以下CREATE TABLE
陳述式在 MySQL 8.4 中有效CREATE TABLE k1 ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20) ) PARTITION BY KEY() PARTITIONS 2;
如果沒有主鍵,但有唯一鍵,則唯一鍵會用作分區鍵
CREATE TABLE k1 ( id INT NOT NULL, name VARCHAR(20), UNIQUE KEY (id) ) PARTITION BY KEY() PARTITIONS 2;
但是,如果唯一鍵欄位未定義為
NOT NULL
,則先前的陳述式會失敗。在這兩種情況下,分區鍵都是
id
欄位,即使它沒有顯示在SHOW CREATE TABLE
的輸出中,或資訊架構PARTITIONS
資料表的PARTITION_EXPRESSION
欄位中。與其他分區類型的情況不同,依
KEY
分區所使用的欄位不限於整數或NULL
值。例如,以下CREATE TABLE
陳述式有效CREATE TABLE tm1 ( s1 CHAR(32) PRIMARY KEY ) PARTITION BY KEY(s1) PARTITIONS 10;
若指定不同的分區類型,則前面的陳述式將無效。(在這種情況下,單純使用
PARTITION BY KEY()
也會有效,並且具有與PARTITION BY KEY(s1)
相同的效果,因為s1
是資料表的主鍵。)如需有關此問題的更多資訊,請參閱第 26.6 節,「分區的限制和侷限」。
分區鍵不支援具有索引前置詞的欄位。這表示
CHAR
、VARCHAR
、BINARY
和VARBINARY
欄位可以用在分區鍵中,前提是它們不使用前置詞;因為必須為索引定義中的BLOB
和TEXT
欄位指定前置詞,因此無法在分區鍵中使用這兩種型別的欄位。在舊版的 MySQL 中,當建立、變更或升級分區資料表時,允許使用前置詞的欄位,即使它們未包含在資料表的分區鍵中;在 MySQL 8.4 中,不再允許這樣做,且伺服器會拒絕任何會影響分區資料表,並在其中發生一個或多個使用前置詞的欄位的CREATE TABLE
或ALTER TABLE
陳述式,並顯示錯誤。請參閱索引前置詞不支援用於鍵值分區。注意使用
NDB
儲存引擎的資料表會隱式地依KEY
分區,並使用資料表的主鍵作為分區鍵(如同其他 MySQL 儲存引擎)。如果 NDB Cluster 資料表沒有明確的主鍵,則由NDB
儲存引擎為每個 NDB Cluster 資料表產生的「隱藏」主鍵會用作分區鍵。如果您為
NDB
資料表定義明確的分區配置,則資料表必須有明確的主鍵,且分區運算式中使用的任何欄位都必須是此鍵的一部分。但是,如果資料表使用「空的」分區運算式,也就是沒有欄位參照的PARTITION BY KEY()
,則不需要明確的主鍵。您可以使用 ndb_desc 公用程式(使用
-p
選項)觀察此分區。重要事項對於依鍵值分區的資料表,您無法執行
ALTER TABLE DROP PRIMARY KEY
,因為這樣做會產生錯誤 ERROR 1466 (HY000): Field in list of fields for partition function not found in table。這對於依KEY
分區的 NDB Cluster 資料表不是問題;在這種情況下,資料表會使用「隱藏」主鍵作為資料表的新分區鍵進行重組。請參閱第 25 章,MySQL NDB Cluster 8.4。
也可以使用線性鍵值分區資料表。以下是一個簡單範例
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;
LINEAR
關鍵字對 KEY
分區的作用與對 HASH
分區的作用相同,分區編號是使用 2 的冪次方演算法而不是模數運算推導而來。請參閱第 26.2.4.1 節,「LINEAR HASH 分區」,以取得此演算法及其含義的描述。