Spec-Zone .ru
спецификации, руководства, описания, API
|
Разделение ключом подобно разделению хешем, за исключением того, что, где разделение хеша использует
определяемое пользователем выражение, хеш-функция для ключевого разделения предоставляется сервером MySQL.
Использование MySQL Cluster MD5()
с этой целью; для таблиц, используя другие механизмы хранения, сервер
использует свою собственную внутреннюю хеш-функцию, которая основана на том же самом алгоритме как PASSWORD()
.
Синтаксис управляет для CREATE TABLE ... PARTITION BY KEY
подобны тем для того,
чтобы составить таблицу, которая делится хешем. Существенные различия перечисляются здесь:
KEY
используется, а не HASH
.
KEY
берет только список нуля или больше имен столбцов.
Любые столбцы, используемые в качестве ключа разделения, должны включить часть или весь первичный ключ
таблицы, если у таблицы есть тот. Где никакое имя столбца не определяется как ключ разделения, первичный
ключ таблицы используется, если есть тот. Например, следующий CREATE TABLE
оператор допустим в MySQL 5.6:
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
столбец INFORMATION_SCHEMA.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
первичный ключ таблицы.)
Для дополнительной информации об этой проблеме см. Раздел 18.6, "Ограничения и Ограничения на Разделение".
Таблицы используя NDB
механизм хранения неявно делится KEY
, снова используя первичный
ключ таблицы в качестве ключа разделения. Когда у таблицы MySQL Cluster нет никакого явного
первичного ключа, "скрытый"
первичный ключ, сгенерированный NDB
механизм хранения для каждой таблицы MySQL Cluster
используется в качестве ключа разделения.
Если Вы определяете явную схему выделения разделов для NDB
таблица, у таблицы должен быть явный первичный ключ, и любые
столбцы, используемые в выражении разделения, должны быть частью этого ключа. Однако, если
таблица использует "пустое"
выражение разделения — то есть, PARTITION BY KEY()
без ссылок
столбца — тогда не требуется никакой явный первичный ключ.
Можно наблюдать это разделение, используя ndb_desc утилиту (с -p
опция).
Для ключевой разделенной таблицы невозможно выполниться ALTER
TABLE DROP PRIMARY KEY
, поскольку выполнение так генерирует ошибочную ОШИБКУ 1466 (HY000): Поле в списке полей для функции раздела, не найденной в таблице.
Это не проблема для таблиц MySQL Cluster, которые делятся KEY
; в
таких случаях таблица реорганизовывается, используя "скрытый"
первичный ключ в качестве нового ключа разделения таблицы. См. Главу
17, MySQL Cluster NDB 7.3.
Также возможно разделить таблицу линейным ключом. Вот простой пример:
CREATE TABLE tk ( col1 INT NOT NULL, col2 CHAR(5), col3 DATE)PARTITION BY LINEAR KEY (col1)PARTITIONS 3;
Используя LINEAR
имеет тот же самый эффект на KEY
разделение, как это делает на HASH
разделение, с числом раздела, получаемым,
используя алгоритм "полномочия два", а не арифметика по модулю. См. Раздел
18.2.4.1,"LINEAR HASH
Разделение", для описания этого алгоритма и
его импликаций.