Spec-Zone .ru
спецификации, руководства, описания, API

17.2.6. Подразделение

Подразделение — также известный как разделение составного объекта — является дальнейшим разделением каждого раздела в разделенной таблице. Рассмотрите следующий CREATE TABLE оператор:

CREATE TABLE ts (id INT, purchased DATE)    PARTITION BY RANGE( YEAR(purchased) )    SUBPARTITION BY HASH( TO_DAYS(purchased) )    SUBPARTITIONS 2 (        PARTITION p0 VALUES LESS THAN (1990),        PARTITION p1 VALUES LESS THAN (2000),        PARTITION p2 VALUES LESS THAN MAXVALUE    );

Таблица ts имеет 3 RANGE разделы. Каждый из этих разделов —p0, p1, и p2— далее делится на 2 подраздела. В действительности вся таблица делится на 3 * 2 = 6 разделы. Однако, из-за действия PARTITION BY RANGE пункт, первые 2 из них хранят только те записи значением меньше чем 1990 в purchased столбец.

В MySQL 5.7 это возможно к подтаблицам разделов, которые делятся RANGE или LIST. Подразделы могут использовать также HASH или KEY разделение. Это также известно как составное разделение.

Отметить

SUBPARTITION BY HASH и SUBPARTITION BY KEY обычно следуйте за теми же самыми правилами синтаксиса как PARTITION BY HASH и PARTITION BY KEY, соответственно. Исключение к этому - это SUBPARTITION BY KEY (в отличие от этого PARTITION BY KEY) в настоящий момент не поддерживает столбец значения по умолчанию, таким образом, столбец, используемый с этой целью, должен быть определен, даже если у таблицы есть явный первичный ключ. Это - известная проблема, которую мы работаем, чтобы решить; см. Проблемы с подразделами, для получения дополнительной информации и примером.

Также возможно определить подразделы, явно используя SUBPARTITION пункты, чтобы определить опции для отдельных подразделов. Например, более многословный вид составления той же самой таблицы ts как показано в предыдущем примере был бы:

CREATE TABLE ts (id INT, purchased DATE)    PARTITION BY RANGE( YEAR(purchased) )    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (        PARTITION p0 VALUES LESS THAN (1990) (            SUBPARTITION s0,            SUBPARTITION s1        ),        PARTITION p1 VALUES LESS THAN (2000) (            SUBPARTITION s2,            SUBPARTITION s3        ),        PARTITION p2 VALUES LESS THAN MAXVALUE (            SUBPARTITION s4,            SUBPARTITION s5        )    );

Некоторые синтаксические знаменитые элементы перечисляются здесь:

Подразделы могут использоваться с особенно большими таблицами, чтобы распределить данные и индексируют через многие диски. Предположите, что у Вас есть 6 дисков, смонтированных как /disk0, /disk1, /disk2, и так далее. Теперь рассмотрите следующий пример:

CREATE TABLE ts (id INT, purchased DATE)    PARTITION BY RANGE( YEAR(purchased) )    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (        PARTITION p0 VALUES LESS THAN (1990) (            SUBPARTITION s0                DATA DIRECTORY = '/disk0/data'                INDEX DIRECTORY = '/disk0/idx',            SUBPARTITION s1                DATA DIRECTORY = '/disk1/data'                INDEX DIRECTORY = '/disk1/idx'        ),        PARTITION p1 VALUES LESS THAN (2000) (            SUBPARTITION s2                DATA DIRECTORY = '/disk2/data'                INDEX DIRECTORY = '/disk2/idx',            SUBPARTITION s3                DATA DIRECTORY = '/disk3/data'                INDEX DIRECTORY = '/disk3/idx'        ),        PARTITION p2 VALUES LESS THAN MAXVALUE (            SUBPARTITION s4                DATA DIRECTORY = '/disk4/data'                INDEX DIRECTORY = '/disk4/idx',            SUBPARTITION s5                DATA DIRECTORY = '/disk5/data'                INDEX DIRECTORY = '/disk5/idx'        )    );

В этом случае отдельный диск используется для данных и для индексирования каждого RANGE. Много других изменений возможны; другой пример мог бы быть:

CREATE TABLE ts (id INT, purchased DATE)    PARTITION BY RANGE(YEAR(purchased))    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (        PARTITION p0 VALUES LESS THAN (1990) (            SUBPARTITION s0a                DATA DIRECTORY = '/disk0'                INDEX DIRECTORY = '/disk1',            SUBPARTITION s0b                DATA DIRECTORY = '/disk2'                INDEX DIRECTORY = '/disk3'        ),        PARTITION p1 VALUES LESS THAN (2000) (            SUBPARTITION s1a                DATA DIRECTORY = '/disk4/data'                INDEX DIRECTORY = '/disk4/idx',            SUBPARTITION s1b                DATA DIRECTORY = '/disk5/data'                INDEX DIRECTORY = '/disk5/idx'        ),        PARTITION p2 VALUES LESS THAN MAXVALUE (            SUBPARTITION s2a,            SUBPARTITION s2b        )    );

Здесь, хранение следующие:

DATA DIRECTORY и INDEX DIRECTORY опции не разрешаются в определениях раздела когда NO_DIR_IN_CREATE режим SQL сервера в действительности. В MySQL 5.7 эти опции также не разрешаются, определяя подразделы (Ошибка #42954).