26.6 Ограничения и пределы дробления
В этом разделе рассматриваются текущие ограничения поддержки дробления в MySQL.
Запрещённые конструкции. Следующие конструкции не допускаются в выражениях дробления:
Процедуры хранения, хранимые функции, загружаемые функции или плагины.
Объявленные переменные или переменные пользователя.
Список SQL-функций, разрешённых в выражениях дробления, см. в разделе 26.6.3 «Ограничения дробления, связанные с функциями».
Арифметические и логические операторы. Использование арифметических операторов +, - и * разрешено в выражениях дробления. Однако результат должен быть целым значением или NULL (за исключением дробления типа [LINEAR] KEY, о котором говорится в других разделах этой главы; см. раздел 26.2 «Типы дробления» для получения дополнительной информации).
Также поддерживается оператор DIV; оператор / запрещен.
Битовые операторы |, &, ^, <<, >> и ~ запрещены в выражениях дробления.
Режим сервера SQL. Таблицы с пользовательским определением дробления не сохраняют режим SQL, действующий в момент их создания. Как обсуждается в других разделах этого руководства (см. раздел 7.1.11 «Режимы SQL сервера»), результаты многих функций и операторов MySQL могут изменяться в зависимости от режима SQL сервера. Поэтому изменение режима SQL в любое время после создания раздробленных таблиц может привести к существенным изменениям в поведении таких таблиц и легко может привести к повреждению или потере данных. По этим причинам настоятельно рекомендуется не изменять режим SQL сервера после создания раздробленных таблиц.
Например, рассмотрим следующее CREATE TABLE оператор, который может быть выполнен успешно только в том случае, если включен режим NO_UNSIGNED_SUBTRACTION:
mysql> SELECT @@sql_mode;
+------------+
| @@sql_mode |
+------------+
| |
+------------+
1 row in set (0.00 sec)
mysql> CREATE TABLE tu (c1 BIGINT UNSIGNED)
-> PARTITION BY RANGE(c1 - 10) (
-> PARTITION p0 VALUES LESS THAN (-5),
-> PARTITION p1 VALUES LESS THAN (0),
-> PARTITION p2 VALUES LESS THAN (5),
-> PARTITION p3 VALUES LESS THAN (10),
-> PARTITION p4 VALUES LESS THAN (MAXVALUE)
-> );
ERROR 1563 (HY000): Partition constant is out of partition function domain
mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@sql_mode;
+-------------------------+
| @@sql_mode |
+-------------------------+
| NO_UNSIGNED_SUBTRACTION |
+-------------------------+
1 row in set (0.00 sec)
mysql> CREATE TABLE tu (c1 BIGINT UNSIGNED)
-> PARTITION BY RANGE(c1 - 10) (
-> PARTITION p0 VALUES LESS THAN (-5),
-> PARTITION p1 VALUES LESS THAN (0),
-> PARTITION p2 VALUES LESS THAN (5),
-> PARTITION p3 VALUES LESS THAN (10),
-> PARTITION p4 VALUES LESS THAN (MAXVALUE)
-> );
Query OK, 0 rows affected (0.05 sec)
Если вы удалите режим сервера SQL NO_UNSIGNED_SUBTRACTION после создания tu, вы можете больше не иметь доступа к этой таблице:
mysql> SET sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM tu;
ERROR 1563 (HY000): Partition constant is out of partition function domain
mysql> INSERT INTO tu VALUES (20);
ERROR 1563 (HY000): Partition constant is out of partition function domain
См. также раздел 7.1.11 «Режимы SQL сервера».
Режимы SQL сервера также влияют на репликацию раздробленных таблиц. Различные режимы SQL на источнике и реплике могут привести к тому, что выражения дробления будут оцениваться по-разному; это может привести к тому, что распределение данных между разделами будет отличаться в источнике и реплике копий данной таблицы, а также может привести к тому, что вставки в раздробленные таблицы, которые выполняются успешно на источнике, завершатся неудачей на реплике. Для достижения наилучших результатов следует использовать один и тот же режим SQL сервера на источнике и реплике.
Учитывая производительность. В следующем списке приведены некоторые эффекты операций дробления на производительность:
-
Операции с файловой системой. Операции дробления и передробления (например,
ALTER TABLEсPARTITION BY ...,REORGANIZE PARTITIONилиREMOVE PARTITIONING) зависят от операций с файловой системой для их реализации. Это означает, что скорость этих операций зависит от таких факторов, как тип файловой системы и ее характеристики, скорость диска, swap-обмен, эффективность обработки файлов операционной системой и параметры и переменные сервера MySQL, относящиеся к обработке файлов. В частности, следует убедиться, чтоlarge_files_supportвключен, аopen_files_limitнастроен правильно. Операции дробления и передробления, связанные сInnoDBтаблицами, могут быть оптимизированы за счет включенияinnodb_file_per_table.См. также Максимальное количество разделов.
Блокировки таблиц. Обычно процесс, выполняющий операцию дробления над таблицей, блокирует таблицу на запись. Чтение из таких таблиц практически не затрагивается; ожидающие
INSERTиUPDATEоперации выполняются сразу после завершения операции дробления. Для специфических исключений дляInnoDBсм. Операции дробления.-
Индексы; выборка по разделам. Как и в нераздробленных таблицах, правильное использование индексов может значительно ускорить запросы к раздробленным таблицам. Кроме того, проектирование раздробленных таблиц и запросов к этим таблицам с учетом выбора по разделам может значительно повысить производительность. Дополнительную информацию см. в разделе 26.4 «Выбор по разделам».
Поддержка смещения условия индекса для раздробленных таблиц. См. раздел 10.2.1.6 «Оптимизация смещения условия индекса».
Производительность с LOAD DATA. В MySQL 9.2
LOAD DATAиспользует буферизацию для повышения производительности. Следует учитывать, что для этого буфер использует 130 КБ памяти на раздел.
Максимальное количество разделов. Максимальное возможное количество разделов для данной таблицы без использования движка хранилища NDB составляет 8192. Это число включает подразделы.
Максимальное возможное количество пользовательских определенных разделов для таблицы, использующей движок хранилища NDB, определяется в зависимости от версии используемого программного обеспечения NDB Cluster, количества узлов данных и других факторов. Дополнительную информацию см. в NDB и пользовательское дробление.
Если при создании таблиц с большим количеством разделов (но меньше максимального) вы получаете сообщение об ошибке, например, Получена ошибка ... от движка хранилища: Недостаточно ресурсов при открытии файла, вы можете решить эту проблему, увеличив значение переменной системы open_files_limit. Однако это зависит от операционной системы и может быть невозможно или нежелательно на всех платформах; см. раздел B.3.2.16 «Ошибки «Файл не найден» и аналогичные ошибки» для получения дополнительной информации. В некоторых случаях использование большого количества (сотен) разделов также может быть нежелательным по другим соображениям, поэтому использование большего количества разделов не гарантирует автоматически лучших результатов.
См. также Операции с файловой системой.
Внешние ключи не поддерживаются для раздробленных таблиц InnoDB. Раздробленные таблицы, использующие движок хранилища InnoDB, не поддерживают внешние ключи. Более конкретно, это означает, что следующие два утверждения верны:
Ни одна таблица
InnoDB, использующая пользовательское дробление, не может содержать ссылок на внешние ключи; никакая таблицаInnoDB, определение которой содержит ссылки на внешние ключи, не может быть раздроблена.Ни одна таблица
InnoDBне может содержать ссылки на внешние ключи к раздробленной таблице с пользовательским определением; никакая таблицаInnoDBс пользовательским дроблением не может содержать столбцы, на которые ссылаются внешние ключи.
Область действия перечисленных ограничений включает все таблицы, которые используют движок хранилища InnoDB. CREATE
TABLE и ALTER TABLE операторы, которые могли бы привести к нарушению этих ограничений, не допускаются.
ALTER TABLE ... ORDER BY. Оператор ALTER TABLE ... ORDER BY
, запущенный на раздробленной таблице, приводит к упорядочиванию строк только внутри каждого раздела.column
ДОБАВЛЕНИЕ СТОЛБЦА ... ALGORITHM=INSTANT. После выполнения ALTER TABLE ... ADD
COLUMN ... ALGORITHM=INSTANT для разнесенной таблицы, обмен разделами с этой таблицей больше невозможен.
Последствия операция REPLACE при изменении первичных ключей. В некоторых случаях (см. Раздел 26.6.1, «Ключи разбиения, первичные ключи и уникальные ключи») может потребоваться изменить первичный ключ таблицы. Имейте в виду, что если ваше приложение использует операторы REPLACE, то результаты выполнения этих операторов могут существенно измениться. Более подробная информация и примеры приведены в разделе 15.2.12, «Оператор REPLACE».
Индексы FULLTEXT. Разнесенные таблицы не поддерживают индексы или поиск с использованием FULLTEXT.
Пространственные столбцы. Столбцы со пространственными типами данных, такими как POINT или GEOMETRY, нельзя использовать в разнесенных таблицах.
Временные таблицы. Временные таблицы не могут быть разнесенными.
Журнальные таблицы. Разбиение журнальных таблиц невозможно; оператор ALTER
TABLE ... PARTITION BY ... для таких таблиц завершается ошибкой.
Тип данных ключевого разбиения. Ключ разбиения должен быть столбцом целого типа данных или выражением, результатом которого является целое число. Выражения, использующие столбцы типа ENUM, не допускаются. Значение столбца или выражения также может быть NULL; см. раздел 26.2.7, «Обработка NULL в MySQL при разбиении».
Существуют два исключения из этого ограничения:
-
При разбиении по [
LINEAR]KEY, можно использовать столбцы любого допустимого типа данных MySQL, кромеTEXTилиBLOB, в качестве ключей разбиения, поскольку внутренние функции хеширования ключей производят правильный тип данных из этих типов. Например, следующие два оператораCREATE TABLEявляются корректными:CREATE TABLE tkc (c1 CHAR) PARTITION BY KEY(c1) PARTITIONS 4; CREATE TABLE tke ( c1 ENUM('red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet') ) PARTITION BY LINEAR KEY(c1) PARTITIONS 6; -
При разбиении по
RANGE COLUMNSилиLIST COLUMNS, можно использовать столбцы строкового типа,DATEиDATETIME. Например, каждый из следующих операторовCREATE TABLEявляется корректным:CREATE TABLE rc (c1 INT, c2 DATE) PARTITION BY RANGE COLUMNS(c2) ( PARTITION p0 VALUES LESS THAN('1990-01-01'), PARTITION p1 VALUES LESS THAN('1995-01-01'), PARTITION p2 VALUES LESS THAN('2000-01-01'), PARTITION p3 VALUES LESS THAN('2005-01-01'), PARTITION p4 VALUES LESS THAN(MAXVALUE) ); CREATE TABLE lc (c1 INT, c2 CHAR(1)) PARTITION BY LIST COLUMNS(c2) ( PARTITION p0 VALUES IN('a', 'd', 'g', 'j', 'm', 'p', 's', 'v', 'y'), PARTITION p1 VALUES IN('b', 'e', 'h', 'k', 'n', 'q', 't', 'w', 'z'), PARTITION p2 VALUES IN('c', 'f', 'i', 'l', 'o', 'r', 'u', 'x', NULL) );
Ни одно из предыдущих исключений не относится к столбцам типов BLOB или TEXT.
Подзапросы. Ключ разбиения не может быть подзапросом, даже если этот подзапрос возвращает целочисленное значение или NULL.
Префиксы индексов столбцов не поддерживаются для разбиения по ключу. При создании таблицы, разнесенной по ключу, столбцы в ключе разбиения, использующие префиксы столбцов, не допускаются в функции разбиения таблицы. Рассмотрим следующий оператор CREATE TABLE, который содержит три столбца VARCHAR, а первичный ключ использует все три столбца и определяет префикс для одного из них. Этот оператор отклоняется с ошибкой, как показано ниже:
mysql> USE d;
Database changed
mysql> CREATE TABLE t1 (
-> a VARCHAR(10000),
-> b VARCHAR(25),
-> c VARCHAR(10),
-> PRIMARY KEY (a(10), b, c)
-> ) PARTITION BY KEY() PARTITIONS 2;
ERROR 6123 (HY000): Column 'd.t1.a' having prefix key part 'a(10)' in the
PARTITION BY KEY() clause is not supported.
Дополнительная информация о разбиении таблиц по ключу приведена в разделе 26.2.5, «Разбиение по ключу».
Проблемы с подразделами. Подразделы должны использовать разбиение по HASH или KEY. Разбиение по RANGE и LIST можно подразделить, а по HASH и KEY — нет.
SUBPARTITION BY KEY требует явного указания столбца или столбцов для подразбиения, в отличие от PARTITION BY KEY, где его можно опустить (в этом случае в качестве столбца подразбиения используется первичный ключ таблицы по умолчанию). Рассмотрим таблицу, созданную следующим оператором:
CREATE TABLE ts (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30)
);
Можно создать таблицу с такими же столбцами, разнесенную по KEY, используя оператор, подобный этому:
CREATE TABLE ts (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30)
)
PARTITION BY KEY()
PARTITIONS 4;
Предыдущий оператор обрабатывается так, как будто он был написан следующим образом, где в качестве столбца разбиения используется первичный ключ таблицы:
CREATE TABLE ts (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30)
)
PARTITION BY KEY(id)
PARTITIONS 4;
Однако, следующий оператор, который пытается создать подразделённую таблицу, используя столбец по умолчанию в качестве столбца подразбиения, завершается ошибкой, и столбец необходимо указать, чтобы оператор выполнился успешно, как показано ниже:
mysql> CREATE TABLE ts (
-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> name VARCHAR(30)
-> )
-> PARTITION BY RANGE(id)
-> SUBPARTITION BY KEY()
-> SUBPARTITIONS 4
-> (
-> PARTITION p0 VALUES LESS THAN (100),
-> PARTITION p1 VALUES LESS THAN (MAXVALUE)
-> );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ')
mysql> CREATE TABLE ts (
-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> name VARCHAR(30)
-> )
-> PARTITION BY RANGE(id)
-> SUBPARTITION BY KEY(id)
-> SUBPARTITIONS 4
-> (
-> PARTITION p0 VALUES LESS THAN (100),
-> PARTITION p1 VALUES LESS THAN (MAXVALUE)
-> );
Query OK, 0 rows affected (0.07 sec)
Это известная проблема (см. ошибку #51470).
Параметры DATA DIRECTORY и INDEX DIRECTORY. Параметры уровня таблицы DATA DIRECTORY и INDEX
DIRECTORY игнорируются (см. ошибку #32091). Можно использовать эти параметры для отдельных разделов или подразделов таблиц InnoDB. Директория, указанная в предложении DATA DIRECTORY, должна быть известна InnoDB. Более подробная информация представлена в разделе по использованию предложения DATA DIRECTORY.
Восстановление и перестроение разнесенных таблиц. Операторы CHECK TABLE, OPTIMIZE TABLE, ANALYZE TABLE и REPAIR TABLE поддерживаются для разнесенных таблиц.
Кроме того, можно использовать ALTER TABLE ... REBUILD
PARTITION для перестроения одного или нескольких разделов разнесенной таблицы; ALTER TABLE ... REORGANIZE
PARTITION также приводит к перестроению разделов. Более подробная информация об этих двух операторах приведена в разделе 15.1.9, «Оператор ALTER TABLE».
ANALYZE, CHECK, OPTIMIZE, REPAIR и TRUNCATE операции поддерживаются для подтаблиц. См. раздел 15.1.9.1, «Операции над разделами таблицы ALTER TABLE».
Имена файлов разделов и подтаблиц включают сгенерированные разделители, такие как #P# и #SP#. Регистр таких разделителей может меняться и на него не следует полагаться.
© 2025 Oracle
Licensed under the GPLv2 License.