以索引鍵分割與以雜湊分割類似,不同之處在於,雜湊分割使用使用者定義的運算式,而索引鍵分割的雜湊函式由 MySQL 伺服器提供。NDB Cluster 為此目的使用 MD5()
;對於使用其他儲存引擎的表格,伺服器會使用其自己的內部雜湊函式。
CREATE TABLE ... PARTITION BY KEY
的語法規則與建立以雜湊分割的表格的規則類似。主要的差異在此列出
使用
KEY
而非HASH
。KEY
只接受零個或多個欄名稱的清單。用作分割區索引鍵的任何欄都必須包含表格主索引鍵的部分或全部 (如果表格有主索引鍵)。如果未將任何欄名稱指定為分割區索引鍵,則會使用表格的主索引鍵 (如果有的話)。例如,以下CREATE TABLE
陳述式在 MySQL 9.0 中有效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
的輸出中,或 Information SchemaPARTITIONS
表格的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
欄指定前置詞,因此無法在分割區索引鍵中使用這兩種欄類型。伺服器會拒絕任何CREATE TABLE
或ALTER TABLE
陳述式,該陳述式會影響分割表格,其中一個或多個使用前置詞的欄位會發生錯誤。請參閱 索引鍵分割不支援欄索引前置詞。注意使用
NDB
儲存引擎的表格會使用表格的主索引鍵作為分割區索引鍵,隱含地以KEY
分割 (與其他 MySQL 儲存引擎一樣)。如果 NDB Cluster 表格沒有明確的主索引鍵,則NDB
儲存引擎為每個 NDB Cluster 表格產生的「隱藏」主索引鍵會用作分割區索引鍵。如果您為
NDB
表格定義明確的分割區配置,則表格必須有明確的主索引鍵,而且分割區運算式中使用的任何欄都必須是此索引鍵的一部分。但是,如果表格使用「空的」分割區運算式 (亦即,沒有欄參考的PARTITION BY KEY()
),則不需要明確的主索引鍵。您可以使用 ndb_desc 公用程式 (使用
-p
選項) 來觀察此分割區。重要對於以索引鍵分割的表格,您無法執行
ALTER TABLE DROP PRIMARY KEY
,因為這樣做會產生錯誤 錯誤 1466 (HY000):表格中找不到分割區函式的欄位清單中的欄位。這對於以KEY
分割的 NDB Cluster 表格來說不是問題;在這種情況下,表格會使用「隱藏」主索引鍵作為表格新的分割區索引鍵來重新組織。請參閱 第 25 章,MySQL NDB Cluster 9.0。
也可以依線性索引鍵分割表格。以下是一個簡單的範例
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 分割區」。