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