Spec-Zone .ru
спецификации, руководства, описания, API
|
Подразделение — также известный как разделение составного объекта — является
дальнейшим разделением каждого раздела в разделенной таблице. Рассмотрите следующий 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 ) );
Некоторые синтаксические знаменитые элементы перечисляются здесь:
У каждого раздела должно быть то же самое число подразделов.
Если Вы явно определяете какое-либо использование подразделов SUBPARTITION
на любом разделе разделенной таблицы следует определить их всех.
Другими словами следующий оператор перестанет работать:
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), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s2, SUBPARTITION s3 ) );
Этот оператор все еще перестал бы работать, даже если бы он включал a SUBPARTITIONS
2
пункт.
Каждый SUBPARTITION
пункт должен включать (как
минимум) имя для подраздела. Иначе, можно установить любую требуемую опцию для подраздела или позволить
этому принимать свою настройку по умолчанию для той опции.
Подымена раздела должны быть уникальными через всю таблицу. Например, следующий CREATE TABLE
оператор допустим в MySQL 5.7:
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 ) );
Здесь, хранение следующие:
Строки с purchased
даты до 1990 приводят огромное
количество в рабочее состояние пространства, так разделяются 4 пути, с отдельным диском, выделенным
данным и индексированию для каждого из этих двух подразделов (s0a
и s0b
) составление раздела p0
. Другими
словами:
Данные для подраздела s0a
сохранен на
/disk0
.
Индексирование для подраздела s0a
сохранены на /disk1
.
Данные для подраздела s0b
сохранен на
/disk2
.
Индексирование для подраздела s0b
сохранены на /disk3
.
Строки, содержащие даты в пределах от 1990 - 1999 (раздел p1
) не требуйте такого большого количества комнаты как тех до 1990. Они
разделяются между 2 дисками (/disk4
и /disk5
)
а не 4 диска как с записями наследства, сохраненными в p0
:
Данные и индексируют принадлежность p1
's
первый подраздел (s1a
) сохранены на /disk4
—
данные в /disk4/data
, и индексирование в /disk4/idx
.
Данные и индексируют принадлежность p1
's
второй подраздел (s1b
) сохранены на /disk5
—
данные в /disk5/data
, и индексирование в /disk5/idx
.
Строки, отражающие даты с 2000 года к подарку (раздел p2
) не занимайте так много места как требуется любым из двух предыдущих
диапазонов. В настоящий момент достаточно сохранить все их в расположении значения по умолчанию.
В будущем, когда число покупок в течение десятилетия, начинающегося с 2000 года, растет к точке, где
расположение значения по умолчанию больше не обеспечивает достаточное пространство, соответствующие
строки могут быть перемещены, используя ALTER TABLE ... REORGANIZE
PARTITION
оператор. См. Раздел 17.3, "управление
Разделом", для объяснения того, как это может быть сделано.
DATA DIRECTORY
и INDEX DIRECTORY
опции не разрешаются в
определениях раздела когда NO_DIR_IN_CREATE
режим SQL сервера в действительности. В MySQL 5.7 эти опции
также не разрешаются, определяя подразделы (Ошибка #42954).