MySQL 8.4 參考手冊  /  ...  /  KEY 分區

26.2.5 KEY 分區

依鍵值進行分區與依雜湊進行分區類似,不同之處在於雜湊分區使用使用者定義的運算式,而鍵值分區的雜湊函數則由 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 節,「分區的限制和侷限」

    分區鍵不支援具有索引前置詞的欄位。這表示 CHARVARCHARBINARYVARBINARY 欄位可以用在分區鍵中,前提是它們不使用前置詞;因為必須為索引定義中的 BLOBTEXT 欄位指定前置詞,因此無法在分區鍵中使用這兩種型別的欄位。在舊版的 MySQL 中,當建立、變更或升級分區資料表時,允許使用前置詞的欄位,即使它們未包含在資料表的分區鍵中;在 MySQL 8.4 中,不再允許這樣做,且伺服器會拒絕任何會影響分區資料表,並在其中發生一個或多個使用前置詞的欄位的 CREATE TABLEALTER 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 分區」,以取得此演算法及其含義的描述。