Spec-Zone.ru › MySQL 8.4

26.2.5 Ключевое разбиение

Разбиение по ключу аналогично разбиению по хэшу, за исключением того, что, где хэш-разбиение использует определяемое пользователем выражение, функция хэширования для ключевого разбиения предоставляется сервером 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 или в столбце 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 столбцов в определениях индексов требуется указать префикс, их нельзя использовать в ключах разбиения. В более старых версиях 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): Поле в списке полей для функции разбиения не найдено в таблице. Это не проблема для таблиц NDB Cluster, которые разбиты по KEY; в таких случаях таблица перестраивается с использованием «скрытого» первичного ключа в качестве нового ключа разбиения. См. главу 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, при этом номер раздела выводится с использованием алгоритма степеней двойки, а не арифметики по модулю. См. раздел 26.2.4.1 «Разбиение LINEAR HASH» для описания этого алгоритма и его последствий.

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

Spec-Zone.ru

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