26.2 Типы разбиения
В этом разделе рассматриваются типы разбиения, доступные в MySQL 9.2. К ним относятся типы, перечисленные ниже:
Разбиение по диапазону. Этот тип разбиения распределяет строки по разделам на основе значений столбцов, попадающих в заданный диапазон. См. Раздел 26.2.1, «Разбиение по диапазону». Сведения об расширении этого типа,
RANGE COLUMNS, см. в Разделе 26.2.3.1, «Разбиение по столбцам в диапазоне».Разбиение по списку. Аналогично разбиению по
RANGE, за исключением того, что раздел выбирается на основе столбцов, соответствующих одному из набора дискретных значений. См. Раздел 26.2.2, «Разбиение по списку». Сведения об расширении этого типа,LIST COLUMNS, см. в Разделе 26.2.3.2, «Разбиение по столбцам в списке».-
Разбиение по хешу. При этом типе разбиения раздел выбирается на основе значения, возвращаемого определяемым пользователем выражением, которое обрабатывает значения столбцов в строках, которые должны быть вставлены в таблицу. Функция может состоять из любого выражения, допустимого в MySQL, которое возвращает целое значение. См. Раздел 26.2.4, «Разбиение по хешу».
Также доступно расширение этого типа,
LINEAR HASH, см. Раздел 26.2.4.1, «Линейное разбиение по хешу». Разбиение по ключу. Этот тип разбиения аналогичен разбиению по
HASH, за исключением того, что предоставляются только один или несколько столбцов для оценки, и сервер MySQL предоставляет собственную функцию хэширования. Эти столбцы могут содержать значения, отличные от целых чисел, поскольку функция хэширования, предоставляемая MySQL, гарантирует результат в виде целого числа независимо от типа данных столбца. Доступно расширение этого типа,LINEAR KEY. См. Раздел 26.2.5, «Разбиение по ключу».
Очень распространенным применением разбиения баз данных является разделение данных по дате. Некоторые системы баз данных поддерживают явное разбиение по дате, которое MySQL не реализует в версии 9.2. Однако в 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 9.2 также можно использовать столбец типа DATE или DATETIME в качестве столбца разбиения, используя RANGE COLUMNS и LIST
COLUMNS разбиение.
Другие типы разбиения требуют выражения разбиения, которое возвращает целое значение или 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(). См. Раздел 14.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, даже если оно оценивается как целое значение. Десятичные дроби не допускаются.
В последующих разделах мы не обязательно предоставляем все возможные формы синтаксиса, которые могут быть использованы для создания каждого типа разбиения; для этой информации см. Раздел 15.1.21, «Заявление CREATE TABLE».
© 2025 Oracle
Licensed under the GPLv2 License.