Spec-Zone.ru › MySQL 5.7

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

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

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

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

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

    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 является первичным ключом таблицы.)

    Дополнительную информацию об этой проблеме см. в разделе 22.6 «Ограничения и ограничения при разбиении».

    Столбцы с префиксами индексов не поддерживаются в ключах разбиения. Это означает, что CHAR, VARCHAR, BINARY и VARBINARY столбцы могут использоваться в ключе разбиения, пока они не используют префиксы; поскольку префикс должен быть указан для BLOB и TEXT столбцов в определениях индексов, нельзя использовать столбцы этих двух типов в ключах разбиения. В MySQL 5.7 столбцы с префиксами разрешены при создании, изменении или обновлении разделяемых таблиц, даже если они не включены в ключ разбиения таблицы. Это известная проблема в MySQL 5.7, которая решена в MySQL 8.0, где это допустимое поведение устарело, и сервер отображает соответствующие предупреждения или ошибки при попытке использовать такие столбцы в этих случаях. См. Префиксы индексов столбцов не поддерживаются для разбиения по ключу для получения дополнительной информации и примеров.

    Примечание

    Таблицы, использующие 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; в таких случаях таблица перестраивается с использованием “скрытого” первичного ключа в качестве нового ключа разбиения таблицы. См. главу 21, MySQL NDB Cluster 7.5 и NDB Cluster 7.6.

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

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

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

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

Spec-Zone.ru

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