26.2 Типы разбиения
В этом разделе рассматриваются типы разбиения, доступные в MySQL 8.4. К ним относятся перечисленные ниже типы:
Разбиение по диапазону. Этот тип разбиения распределяет строки по разделам на основе значений столбцов, попадающих в заданный диапазон. См. раздел 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 в версии 8.4 этого не реализует. Однако в 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 8.4 также можно использовать столбец типа 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.20, «Утверждение CREATE TABLE».
© 2025 Oracle
Licensed under the GPLv2 License.