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.