26.1 Обзор разбиения в MySQL
В этом разделе представлен концептуальный обзор разбиения в MySQL 8.4.
Сведения о ограничениях разбиения и ограничениях функциональности см. в разделе 26.6 «Ограничения и пределы разбиения».
Стандарт SQL не предоставляет много руководств по физическим аспектам хранения данных. Язык SQL сам по себе предназначен для работы независимо от каких-либо структур данных или носителей, лежащих в основе схем, таблиц, строк или столбцов, с которыми он работает. Тем не менее, большинство продвинутых систем управления базами данных разработали способы определения физического расположения, используемого для хранения определенных фрагментов данных в терминах файловой системы, аппаратного обеспечения или даже обоих. В MySQL InnoDB движок хранения давно поддерживает понятие пространства таблицы (см. раздел 17.6.3 «Пространства таблиц»), и сервер MySQL, даже до появления разбиения, мог быть настроен на использование различных физических каталогов для хранения различных баз данных (см. раздел 10.12.2 «Использование символических ссылок» для объяснения того, как это делается).
Разбиение развивает эту идею, позволяя распределять части отдельных таблиц по файловой системе в соответствии с правилами, которые можно настраивать по мере необходимости. По сути, различные части таблицы хранятся как отдельные таблицы в разных местах. Выбранное пользователем правило, с помощью которого выполняется разделение данных, известно как функция разбиения, которая в MySQL может представлять собой модуль, простое сопоставление набора диапазонов или списков значений, внутреннюю функцию хэширования или линейную функцию хэширования. Функция выбирается в соответствии с типом разбиения, указанным пользователем, и принимает в качестве параметра значение выражения, предоставленного пользователем. Это выражение может быть значением столбца, функцией, действующей над одним или несколькими значениями столбцов, или набором одного или нескольких значений столбцов в зависимости от используемого типа разбиения.
В случае RANGE, LIST и [LINEAR] HASH разбиение, значение столбца разбиения передается функции разбиения, которая возвращает целое значение, представляющее номер раздела, в котором этот конкретный запис должен быть сохранен. Эта функция должна быть неконстантной и неслучайной. Она не может содержать запросов, но может использовать SQL-выражение, которое допустимо в MySQL, при условии, что это выражение возвращает либо NULL, или целое число intval таким образом, что
-MAXVALUE <= intval <= MAXVALUE
(MAXVALUE используется для представления наименьшего верхнего предела для рассматриваемого типа целого числа. -MAXVALUE представляет наибольший нижний предел.)
Для [LINEAR] KEY, RANGE COLUMNS и LIST
COLUMNS разбиение выражение разбиения состоит из списка одного или нескольких столбцов.
Для [LINEAR] KEY разбиение функция разбиения предоставляется MySQL.
Дополнительную информацию о разрешенных типах столбцов разбиения и функциях разбиения см. в разделе 26.2 «Типы разбиения», а также в разделе 15.1.20 «Оператор CREATE TABLE», который содержит описания синтаксиса разбиения и дополнительные примеры. Сведения об ограничениях функций разбиения см. в разделе 26.6.3 «Ограничения разбиения, связанные с функциями».
Это известно как горизонтальное разбиение — то есть различные строки таблицы могут быть назначены различным физическим разделам. MySQL 8.4 не поддерживает вертикальное разбиение, в котором разные столбцы таблицы назначаются разным физическим разделам. В настоящее время нет планов по внедрению вертикального разбиения в MySQL.
Для создания разбиений таблиц необходимо использовать движок хранения, который их поддерживает. В MySQL 8.4 все разделы одной и той же таблицы с разбиением должны использовать один и тот же движок хранения. Однако ничего не мешает использовать разные движки хранения для разных таблиц с разбиением на одном сервере MySQL или даже в одной базе данных.
В MySQL 8.4 движки хранения, которые поддерживают разбиение, — это только InnoDB и NDB. Разбиение нельзя использовать с движками хранения, которые его не поддерживают; к ним относятся движки хранения MyISAM, MERGE, CSV и FEDERATED.
Разбиение по KEY или LINEAR
KEY возможно с NDB, но другие типы пользовательского разбиения не поддерживаются для таблиц, использующих этот движок хранения. Кроме того, таблица NDB, использующая пользовательское разбиение, должна иметь явный первичный ключ, а любые столбцы, указанные в выражении разбиения таблицы, должны быть частью первичного ключа. Однако, если в пункте PARTITION BY KEY или PARTITION BY
LINEAR KEY оператора CREATE
TABLE или ALTER
TABLE, используемого для создания или изменения пользовательской таблицы с разбиением NDB, не указаны никакие столбцы, то таблица не обязана иметь явный первичный ключ. Дополнительные сведения см. в разделе 25.2.7.1 «Несоответствие синтаксису SQL в NDB Cluster».
При создании таблицы с разбиением используется тот же движок хранения по умолчанию, что и при создании любой другой таблицы; для изменения этого поведения достаточно использовать параметр [STORAGE]
ENGINE, как и для таблицы без разбиения. Целевой движок хранения должен обеспечивать поддержку разбиения, в противном случае оператор завершается ошибкой. Следует помнить, что [STORAGE] ENGINE (и другие параметры таблицы) должны перечисляться перед любыми параметрами разбиения в операторе CREATE
TABLE. Этот пример показывает, как создать таблицу, разбитную по хэшу на 6 разделов и использующую движок хранения InnoDB (независимо от значения default_storage_engine):
CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE)
ENGINE=INNODB
PARTITION BY HASH( MONTH(tr_date) )
PARTITIONS 6;
Каждый пункт PARTITION может включать параметр [STORAGE] ENGINE, но в MySQL 8.4 это не имеет эффекта.
Если не указано иное, в оставшихся примерах в этом обсуждении предполагается, что default_storage_engine равно InnoDB.
Разбиение применяется ко всем данным и индексам таблицы; нельзя разделить только данные, а не индексы, или наоборот, а также нельзя разделить только часть таблицы.
Данные и индексы каждого раздела можно назначить в определенный каталог, используя параметры DATA DIRECTORY и INDEX DIRECTORY для пункта PARTITION оператора CREATE TABLE, используемого для создания разбиения таблицы.
Только параметр DATA DIRECTORY поддерживается для отдельных разделов и подразделов таблиц InnoDB. Каталог, указанный в пункте DATA DIRECTORY, должен быть известен InnoDB. Дополнительные сведения см. в разделе «Использование пункта DATA DIRECTORY».
Все столбцы, используемые в выражении разбиения таблицы, должны быть частью каждого уникального ключа таблицы, включая первичный ключ. Это означает, что таблицу, созданную следующим SQL-оператором, нельзя разделить:
CREATE TABLE tnp (
id INT NOT NULL AUTO_INCREMENT,
ref BIGINT NOT NULL,
name VARCHAR(255),
PRIMARY KEY pk (id),
UNIQUE KEY uk (name)
);
Поскольку у ключей pk и uk нет общих столбцов, доступные столбцы для использования в выражении разбиения отсутствуют. Возможные решения в этой ситуации включают добавление столбца name к первичному ключу таблицы, добавление столбца id в uk или просто удаление уникального ключа. Дополнительные сведения см. в разделе 26.6.1 «Ключи разбиения, первичные ключи и уникальные ключи».
Кроме того, можно использовать MAX_ROWS и MIN_ROWS для определения максимального и минимального числа строк соответственно, которые могут храниться в каждом разделе. Дополнительные сведения об этих параметрах см. в разделе 26.3 «Управление разбиением».
Параметр MAX_ROWS также может быть полезен для создания таблиц NDB Cluster с дополнительными разделами, что позволяет расширить хранилище индексов хэша. См. документацию параметра конфигурации узла данных DataMemory, а также раздел 25.2.2 «Узлы NDB Cluster, группы узлов, фрагменты реплик и разделы» для получения дополнительной информации.
Вот некоторые преимущества разбиения:
Разбиение позволяет хранить больше данных в одной таблице, чем может уместиться на одном диске или файловой системе.
Данные, которые теряют свою полезность, часто можно легко удалить из разбиеной таблицы, удалив разбиение (или разбиения), содержащие только эти данные. И наоборот, процесс добавления новых данных в некоторых случаях может быть значительно облегчен добавлением одного или нескольких новых разбиений для хранения именно этих данных.
-
Некоторые запросы могут быть значительно оптимизированы благодаря тому, что данные, удовлетворяющие заданному
WHEREусловию, могут храниться только в одном или нескольких разбиениях, что автоматически исключает все остальные разбиения из поиска. Поскольку разбиения можно изменять после создания разбиеной таблицы, вы можете переорганизовать свои данные для повышения эффективности частых запросов, которые могли не использоваться часто при первоначальном настройке схемы разбиения. Эта возможность исключать несоответствующие разбиения (и, следовательно, любые строки, которые они содержат) часто называется обрезкой разбиений. Дополнительную информацию см. в разделе 26.4 «Обрезка разбиений».Кроме того, MySQL поддерживает явное выделение разбиений для запросов. Например,
SELECT * FROM t PARTITION (p0,p1) WHERE c < 5выбирает только те строки в разбиенияхp0иp1, которые соответствуют условиюWHERE. В этом случае MySQL не проверяет никакие другие разбиения таблицыt; это может значительно ускорить запросы, когда вы уже знаете, какое или какие разбиения хотите изучить. Выделение разбиений также поддерживается для операторов изменения данныхDELETE,INSERT,REPLACE,UPDATEиLOAD DATA,LOAD XML. Дополнительную информацию и примеры см. в описаниях этих операторов.
© 2025 Oracle
Licensed under the GPLv2 License.