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.