MySQL 9.0 參考手冊  /  ...  /  KEY 分割區

26.2.5 KEY 分割區

以索引鍵分割與以雜湊分割類似,不同之處在於,雜湊分割使用使用者定義的運算式,而索引鍵分割的雜湊函式由 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 Schema 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 節,「分割區的限制和局限」

    分割區索引鍵中不支援具有索引前置詞的欄。這表示 CHARVARCHARBINARYVARBINARY 欄可以用在分割區索引鍵中,前提是它們不使用前置詞;因為必須為索引定義中的 BLOBTEXT 欄指定前置詞,因此無法在分割區索引鍵中使用這兩種欄類型。伺服器會拒絕任何 CREATE TABLEALTER 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 分割區」