26.1 Обзор разбиения в MySQL
В этом разделе представлен концептуальный обзор разбиения в MySQL 9.2.
Сведения о ограничениях разбиения и функциональных ограничениях см. в разделе 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.21 «Оператор CREATE TABLE», где содержатся описания синтаксиса разбиения и дополнительные примеры. Сведения об ограничениях функций разбиения см. в разделе 26.6.3 «Ограничения разбиения, относящиеся к функциям».
Это известно как горизонтальное разбиение — то есть разные строки таблицы могут быть назначены разным физическим разделам. MySQL 9.2 не поддерживает вертикальное разбиение, в котором разные столбцы таблицы назначаются различным физическим разделам. В настоящее время нет планов по внедрению вертикального разбиения в MySQL.
Для создания разбиенимых таблиц необходимо использовать движок хранения, который их поддерживает. В MySQL 9.2 все разделы одной разбиенимой таблицы должны использовать один и тот же движок хранения. Однако ничего не мешает использовать разные движки хранения для разных разбиенимых таблиц на одном сервере MySQL или даже в одной базе данных.
В MySQL 9.2 единственными движками хранения, поддерживающими разбиение, являются 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 9.2 это не имеет эффекта.
Если не указано иное, в последующих примерах обсуждения предполагается, что 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.