Spec-Zone.ru › MySQL 9.2

26.2.5 Разбиение по ключу

Разбиение по ключу аналогично разбиению по хэшу, за исключением того, что в разбиении по хэшу используется определяемое пользователем выражение, а функция хэширования для разбиения по ключу предоставляется сервером MySQL. NDB Cluster использует MD5() для этой цели; для таблиц, использующих другие движки хранилища, сервер использует собственную внутреннюю функцию хэширования.

Правила синтаксиса для CREATE TABLE ... PARTITION BY KEY аналогичны правилам создания таблицы, разбитой по хэшу. Основные различия перечислены здесь:

  • Используется KEY вместо HASH.

  • KEY принимает только список из нуля или более имен столбцов. Любые столбцы, используемые в качестве ключа разбиения, должны составлять часть или все первичный ключ таблицы, если таблица имеет первичный ключ. Если имя столбца не указано в качестве ключа разбиения, используется первичный ключ таблицы, если он есть. Например, следующее CREATE TABLE оператор допустим в MySQL 9.2:

    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 или в столбце PARTITION_EXPRESSION таблицы Информационной схемы PARTITIONS.

    В отличие от других типов разбиения, столбцы, используемые для разбиения по 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, так как это приводит к ошибке ERROR 1466 (HY000): Field in list of fields for partition function not found in table. Это не проблема для таблиц NDB Cluster, которые разбиты по KEY; в таких случаях таблица реорганизуется с использованием “скрытого” первичного ключа в качестве нового ключа разбиения таблицы. См. Главу 25, MySQL NDB Cluster 9.2.

Также можно разбить таблицу по линейному ключу. Вот простой пример:

CREATE TABLE tk (
    col1 INT NOT NULL,
    col2 CHAR(5),
    col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;

Ключевое слово LINEAR оказывает такое же влияние на разбиение по KEY, как и на разбиение по HASH, причем номер раздела вычисляется с помощью алгоритма степеней двойки, а не с помощью модульной арифметики. См. Раздел 26.2.4.1, «Разбиение LINEAR HASH» для описания этого алгоритма и его последствий.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/partitioning-key.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API