22.2 Типы разбиения
В этом разделе рассматриваются типы разбиения, доступные в MySQL 5.7. Они включают следующие типы:
Разбиение RANGE. Этот тип разбиения распределяет строки по разделам на основе значений столбца, попадающих в заданный диапазон. См. Раздел 22.2.1, «Разбиение RANGE». Сведения об расширении этого типа,
RANGE COLUMNS, см. в Разделе 22.2.3.1, «Разбиение RANGE COLUMNS».Разбиение LIST. Аналогично разбиению по
RANGE, за исключением того, что раздел выбирается на основе столбцов, соответствующих одному из набора дискретных значений. См. Раздел 22.2.2, «Разбиение LIST». Сведения об расширении этого типа,LIST COLUMNS, см. в Разделе 22.2.3.2, «Разбиение LIST COLUMNS».-
Разбиение HASH. С этим типом разбиения раздел выбирается на основе значения, возвращаемого определяемым пользователем выражением, которое обрабатывает значения столбцов в строках, которые должны быть вставлены в таблицу. Функция может содержать любое выражение, допустимое в MySQL, которое возвращает целое значение. См. Раздел 22.2.4, «Разбиение HASH».
Доступно расширение этого типа,
LINEAR HASH, см. Раздел 22.2.4.1, «Разбиение LINEAR HASH». Разбиение KEY. Этот тип разбиения аналогичен разбиению по
HASH, за исключением того, что задается один или несколько столбцов для оценки, а сервер MySQL предоставляет собственную функцию хэширования. Эти столбцы могут содержать значения, отличные от целых чисел, поскольку функция хэширования, предоставляемая MySQL, гарантирует целочисленный результат независимо от типа данных столбца. Доступно расширение этого типа,LINEAR KEY. См. Раздел 22.2.5, «Разбиение KEY».
Очень распространенное использование разбиения баз данных — разделение данных по дате. Некоторые системы баз данных поддерживают явное разбиение по дате, чего MySQL не реализует в версии 5.7. Однако в MySQL несложно создать схемы разбиения на основе столбцов DATE, TIME или DATETIME или на основе выражений, использующих такие столбцы.
При разбиении по KEY или LINEAR
KEY можно использовать столбец DATE, TIME или DATETIME в качестве столбца разбиения без каких-либо изменений значения столбца. Например, данное утверждение создания таблицы является вполне допустимым в MySQL:
CREATE TABLE members (
firstname VARCHAR(25) NOT NULL,
lastname VARCHAR(25) NOT NULL,
username VARCHAR(16) NOT NULL,
email VARCHAR(35),
joined DATE NOT NULL
)
PARTITION BY KEY(joined)
PARTITIONS 6;
В MySQL 5.7 также можно использовать столбец DATE или DATETIME в качестве столбца разбиения с использованием RANGE COLUMNS и LIST
COLUMNS разбиений.
Однако другие типы разбиения MySQL требуют выражения разбиения, которое возвращает целое значение или NULL. Если вы хотите использовать разбиение по дате с помощью RANGE, LIST, HASH или LINEAR HASH, вы можете просто использовать функцию, которая обрабатывает столбец DATE, TIME или DATETIME и возвращает такое значение, как показано здесь:
CREATE TABLE members (
firstname VARCHAR(25) NOT NULL,
lastname VARCHAR(25) NOT NULL,
username VARCHAR(16) NOT NULL,
email VARCHAR(35),
joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
PARTITION p0 VALUES LESS THAN (1960),
PARTITION p1 VALUES LESS THAN (1970),
PARTITION p2 VALUES LESS THAN (1980),
PARTITION p3 VALUES LESS THAN (1990),
PARTITION p4 VALUES LESS THAN MAXVALUE
);
Дополнительные примеры разбиения по дате можно найти в следующих разделах этой главы:
Для более сложных примеров разбиения по дате см. следующие разделы:
Разбиение MySQL оптимизировано для использования функций TO_DAYS(), YEAR() и TO_SECONDS(). Однако можно использовать другие функции даты и времени, возвращающие целое число или NULL, такие как WEEKDAY(), DAYOFYEAR() или MONTH(). Более подробная информация о таких функциях приведена в Разделе 12.7, «Функции даты и времени».
Важно помнить — независимо от типа используемого разбиения — что разделы всегда нумеруются автоматически и последовательно при создании, начиная с 0. При вставке новой строки в разбиение таблицы для определения правильного раздела используются именно эти номера разделов. Например, если ваша таблица использует 4 раздела, эти разделы пронумерованы как 0, 1, 2 и 3. Для типов разбиения RANGE и LIST необходимо убедиться, что для каждого номера раздела определен раздел. Для разбиения HASH выражение, заданное пользователем, должно вычисляться в целое значение. Для разбиения KEY эта проблема автоматически решается функцией хэширования, используемой сервером MySQL.
Имена разделов обычно соответствуют правилам, определяющим другие идентификаторы MySQL, такие как те, которые используются для таблиц и баз данных. Однако следует учитывать, что имена разделов нечувствительны к регистру. Например, следующее утверждение CREATE TABLE не выполняется, как показано:
mysql> CREATE TABLE t2 (val INT)
-> PARTITION BY LIST(val)(
-> PARTITION mypart VALUES IN (1,3,5),
-> PARTITION MyPart VALUES IN (2,4,6)
-> );
ERROR 1488 (HY000): Duplicate partition name mypart
Ошибка возникает, потому что MySQL не видит разницы между именами разделов mypart и MyPart.
При указании количества разделов для таблицы это должно быть выражено как положительная, отличная от нуля целочисленная литеральная константа без ведущих нулей и не может быть выражением, таким как 0.8E+01 или 6-2, даже если оно вычисляется в целочисленное значение. Десятичные дроби недопустимы.
В следующих разделах мы не обязательно предоставляем все возможные формы синтаксиса, которые можно использовать для создания каждого типа разбиения; эта информация может быть найдена в Разделе 13.1.18, «Утверждение CREATE TABLE».
© 2025 Oracle
Licensed under the GPLv2 License.