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.