Spec-Zone.ru › MySQL 5.7

22.1 Обзор разбиения в MySQL

В этом разделе представлен концептуальный обзор разбиения в MySQL 5.7.

Сведения о ограничениях разбиения и функциональных ограничениях см. в разделе 22.6, «Ограничения и пределы разбиения».

Стандарт SQL не предоставляет много рекомендаций относительно физических аспектов хранения данных. Язык SQL сам по себе предназначен для работы независимо от каких-либо структур данных или носителей, лежащих в основе схем, таблиц, строк или столбцов, с которыми он работает. Тем не менее, большинство продвинутых систем управления базами данных разработали способы определения физического расположения для хранения определенных фрагментов данных с точки зрения файловой системы, аппаратного обеспечения или обоих. В MySQL движок хранения InnoDB давно поддерживает понятие табличного пространства, и сервер MySQL, даже до появления разбиения, мог быть настроен на использование разных физических каталогов для хранения разных баз данных (см. раздел 8.12.3, «Использование символических ссылок» для объяснения того, как это делается).

Разбиение развивает эту идею дальше, позволяя распределять части отдельных таблиц по файловой системе в соответствии с правилами, которые вы можете устанавливать в основном по мере необходимости. По сути, различные части таблицы хранятся как отдельные таблицы в разных местах. Выбранное пользователем правило, по которому выполняется разделение данных, известно как функция разбиения, которая в MySQL может представлять собой модуль, простое соответствие набору диапазонов или списков значений, внутреннюю функцию хэширования или функцию линейного хэширования. Функция выбирается в соответствии с типом разбиения, указанным пользователем, и принимает в качестве параметра значение выражения, предоставленного пользователем. Это выражение может быть значением столбца, функцией, действующей над одним или несколькими значениями столбцов, или набором одного или нескольких значений столбцов в зависимости от используемого типа разбиения.

В случае RANGE, LIST и [LINEAR] HASH разбиения значение столбца разбиения передается функции разбиения, которая возвращает целое число, представляющее номер раздела, в котором должен храниться конкретный запис. Эта функция должна быть неконстантной и неслучайной. Она не может содержать запросов, но может использовать выражение SQL, которое допустимо в MySQL, при условии, что это выражение возвращает либо NULL, либо целое число intval, такое что

-MAXVALUE <= intval <= MAXVALUE

(MAXVALUE используется для представления наименьшего верхнего предела для типа целого числа. -MAXVALUE представляет наибольший нижний предел.)

Для [LINEAR] KEY, RANGE COLUMNS и LIST COLUMNS разбиения выражение разбиения состоит из списка одного или нескольких столбцов.

Для [LINEAR] KEY разбиения функция разбиения предоставляется MySQL.

Более подробную информацию о разрешенных типах столбцов разбиения и функциях разбиения см. в разделе 22.2, «Типы разбиения», а также в разделе 13.1.18, «Оператор CREATE TABLE», который содержит описания синтаксиса разбиения и дополнительные примеры. Сведения об ограничениях функций разбиения см. в разделе 22.6.3, «Ограничения разбиения, относящиеся к функциям».

Это называется горизонтальным разбиением — то есть различные строки таблицы могут быть назначены различным физическим разделам. MySQL 5.7 не поддерживает вертикальное разбиение, при котором различные столбцы таблицы назначаются разным физическим разделам. В настоящее время нет планов по внедрению вертикального разбиения в MySQL.

Сведения о том, поддерживает ли ваш двоичный файл MySQL Server разбиение, определяемое пользователем, см. в главе 22, «Разбиение».

Для создания разнесенных таблиц вы можете использовать большинство поддерживаемых вашим сервером MySQL движков хранения; движок разбиения MySQL работает на отдельном уровне и может взаимодействовать с любым из них. В MySQL 5.7 все разделы одной разнесенной таблицы должны использовать один и тот же движок хранения; например, вы не можете использовать MyISAM для одного раздела и InnoDB для другого. Однако нет никаких препятствий для использования разных движков хранения для разных разнесенных таблиц на одном сервере MySQL или даже в одной базе данных.

Разбиение MySQL не может использоваться с движками хранения MERGE, CSV или FEDERATED.

Разбиение по KEY или LINEAR KEY возможно с NDB, но другие типы разбиения, определяемые пользователем, не поддерживаются для таблиц, использующих этот движок хранения. Кроме того, таблица NDB, использующая разбиение, определяемое пользователем, должна иметь явный первичный ключ, а любые столбцы, указанные в выражении разбиения таблицы, должны входить в первичный ключ. Однако, если в пункте PARTITION BY KEY или PARTITION BY LINEAR KEY оператора CREATE TABLE или ALTER TABLE, используемого для создания или изменения таблицы с разбиением, определяемым пользователем, не указаны никакие столбцы, то таблица не обязана иметь явный первичный ключ. Дополнительные сведения см. в разделе 21.2.7.1, «Несоответствие синтаксису SQL в NDB Cluster».

Чтобы использовать определенный движок хранения для разнесенной таблицы, необходимо только использовать опцию [STORAGE] ENGINE так же, как и для неразнесенной таблицы. Однако следует помнить, что [STORAGE] ENGINE (и другие параметры таблицы) должны быть указаны перед любыми параметрами разбиения в операторе CREATE TABLE. Этот пример показывает, как создать таблицу, разнесенную по хэшу на 6 разделов и использующую движок хранения InnoDB:

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 5.7 это не влияет на результат.

Важно

Разбиение применяется ко всем данным и индексам таблицы; вы не можете разделить только данные, не разделяя индексы, и наоборот, также вы не можете разделить только часть таблицы.

Данные и индексы для каждого раздела могут быть назначены в определенный каталог с помощью параметров DATA DIRECTORY и INDEX DIRECTORY для пункта PARTITION оператора CREATE TABLE используемого для создания разнесенной таблицы.

DATA DIRECTORY и INDEX DIRECTORY не поддерживаются для отдельных разделов или подразделов таблиц MyISAM в Windows.

Только опция DATA DIRECTORY поддерживается для отдельных разделов и подразделов таблиц InnoDB.

Все столбцы, используемые в выражении разбиения таблицы, должны быть частью каждого уникального ключа, который может иметь таблица, включая любой первичный ключ. Это означает, что такую таблицу, созданную следующим оператором 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 или просто удаление уникального ключа. Дополнительные сведения см. в разделе 22.6.1, «Ключи разбиения, первичные ключи и уникальные ключи».

Кроме того, MAX_ROWS и MIN_ROWS могут использоваться для определения максимального и минимального числа строк соответственно, которые могут храниться в каждом разделе. Дополнительные сведения об этих параметрах см. в разделе 22.3, «Управление разбиением».

Параметр MAX_ROWS также может быть полезен для создания таблиц NDB Cluster с дополнительными разделами, что позволит увеличить хранилище индексов хэширования. См. документацию по параметру конфигурации узла данных DataMemory, а также раздел 21.2.2, «Узлы NDB Cluster, группы узлов, фрагментные реплики и разделы» для получения дополнительной информации.

Некоторые преимущества разбиения перечислены здесь:

END_OF_DOCUMENT_MARKER
  • Разбиение позволяет хранить больше данных в одной таблице, чем может уместиться на одном диске или раздела файловой системы.

  • Данные, которые теряют свою полезность, часто можно легко удалить из разбиеной таблицы, удалив раздел (или разделы), содержащие только эти данные. И наоборот, процесс добавления новых данных в некоторых случаях может быть значительно упрощен путем добавления одного или нескольких новых разделов для хранения именно этих данных.

  • Некоторые запросы могут быть значительно оптимизированы благодаря тому, что данные, удовлетворяющие заданному WHERE условию, могут храниться только в одном или нескольких разделах, что автоматически исключает все остальные разделы из поиска. Поскольку разделы могут быть изменены после создания разбиеной таблицы, вы можете переорганизовать данные, чтобы улучшить часто используемые запросы, которые могли не использоваться часто при первом создании схемы разбиения. Эта возможность исключать несоответствующие разделы (и, следовательно, любые строки, которые они содержат), часто называется оптимизацией по разделам. Дополнительную информацию см. в разделе 22.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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/partitioning-overview.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API