Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел обеспечивает концептуальный краткий обзор разделения в MySQL 5.7.
Для получения информации о разделении ограничений и ограничений функции, см. Раздел 17.6, "Ограничения и Ограничения на Разделение".
Стандарт SQL не обеспечивает очень в способе руководства относительно физических аспектов хранения данных. Язык
самого SQL предназначается, чтобы работать независимо от любых структур данных или носителей, базовых схемы,
таблицы, строки, или столбцы, с которыми он работает. Тем не менее, наиболее усовершенствованные системы
управления базами данных развили некоторые средства определения физического расположения, которое будет
использоваться для того, чтобы сохранить определенные части данных с точки зрения файловой системы, аппаратных
средств или даже обоих. В MySQL, InnoDB
механизм хранения долго поддерживал понятие
табличной области, и MySQL Server, даже до введения разделения, мог быть сконфигурирован, чтобы использовать
различные физические каталоги для того, чтобы сохранить различные базы данных (см. Раздел
8.11.3.1, "Используя Символьные ссылки", для объяснения того, как это делается).
Разделение берет это понятие шаг далее, позволяя Вам распределить части отдельных таблиц через файловую систему согласно правилам, которые можно установить в значительной степени как необходимый. В действительности различные части таблицы сохранены как отдельные таблицы в различных расположениях. Выбранное пользователем правило, по которому выполняется подразделение данных, известно как функция разделения, которая в MySQL может быть модулем, простым соответствием против ряда диапазонов или оценить списки, внутреннюю хеш-функцию, или линейную хеш-функцию. Функция выбирается согласно типу разделения, определенному пользователем, и берет в качестве его параметра значение предоставленного пользователем выражения. Это выражение может быть значением столбца, функция, действующая на одно или более значений столбцов, или ряд того или большего количества значений столбцов, в зависимости от типа разделения, которое используется.
В случае RANGE
, LIST
, и [LINEAR
] HASH
деля, значение столбца разделения передают
к функции разделения, которая возвращает целочисленное значение, представляющее число раздела, в котором должна
быть сохранена та определенная запись. Эта функция должна быть непостоянной и неслучайной. Это, возможно, не
содержит запросов, но может использовать SQL-выражение, которое допустимо в MySQL, пока то выражение
возвращается также NULL
или целое число intval
так, что
-MAXVALUE <= intval
<= MAXVALUE
(MAXVALUE
используется, чтобы представить наименьшее количество верхней границы для
типа рассматриваемого целого числа. -MAXVALUE
представляет самую большую нижнюю
границу.)
Для [LINEAR
] KEY
, RANGE
COLUMNS
, и LIST COLUMNS
деля, выражение разделения состоит из списка одного
или более столбцов.
Для [LINEAR
] KEY
деля, функция разделения
предоставляется MySQL.
Для получения дополнительной информации о разрешенных типах столбца разделения и разделении функций, см. Раздел 17.2,
"Деля Типы", так же как Раздел 13.1.14,"CREATE TABLE
Синтаксис", который обеспечивает описания синтаксиса разделения
и дополнительные примеры. Для получения информации об ограничениях на разделение функций см. Раздел
17.6.3, "Деля Ограничения, Касающиеся Функций".
Это известно как горизонтальное разделение — то есть, различные строки таблицы могут быть присвоены различным физическим разделам. MySQL 5.7 не поддерживает вертикальное разделение, в котором различные столбцы таблицы присваиваются различным физическим разделам. Нет в это время никаких планов ввести вертикальное разделение в MySQL 5.7.
Для получения информации об определении, поддерживает ли Ваш двоичный файл MySQL Server определяемое пользователем разделение, см. Главу 17, Деля.
Для того, чтобы создать разделенные таблицы, можно использовать большинство механизмов хранения, которые
поддерживаются Вашим сервером MySQL; MySQL, делящий выполнения механизма в отдельном уровне и, может
взаимодействовать с любым из них. В MySQL 5.7 все разделы той же самой разделенной таблицы должны использовать
тот же самый механизм хранения; например, невозможно использовать MyISAM
для одного
раздела и InnoDB
для другого. Однако, нет ничего препятствующего тому Вам
использовать различные механизмы хранения для различных разделенных таблиц на том же самом сервере MySQL или
даже в той же самой базе данных.
Разделение MySQL не может использоваться с MERGE
, CSV
,
или FEDERATED
механизмы хранения.
Чтобы использовать определенный механизм хранения для разделенной таблицы, необходимо только использовать [STORAGE] ENGINE
опция, как Вы были бы для неразделенной таблицы. Однако, следует
иметь в виду это [STORAGE] ENGINE
(и другие табличные опции), должен быть
перечислен прежде, чем любые опции разделения используются в a 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
пункт может включать a [STORAGE]
ENGINE
опция, но в MySQL 5.7 это не имеет никакого эффекта.
Разделение применяется ко всем данным и индексирует таблицы; невозможно разделить только данные и не индексирование, или наоборот, и при этом невозможно разделить только часть таблицы.
Данные и индексируют для каждого раздела, может быть присвоен определенному каталогу, используя DATA DIRECTORY
и INDEX DIRECTORY
опции для PARTITION
пункт CREATE
TABLE
оператор, используемый, чтобы создать разделенную таблицу.
DATA DIRECTORY
и INDEX DIRECTORY
опции не имеют
никакого эффекта, определяя разделы для таблиц, используя InnoDB
механизм хранения.
DATA DIRECTORY
и INDEX DIRECTORY
не поддерживаются для
отдельных разделов или подразделов на Windows. Эти опции игнорируются на Windows, за исключением того, что
предупреждение сгенерировано.
Кроме того, MAX_ROWS
и MIN_ROWS
может использоваться,
чтобы определить максимальные и минимальные числа строк, соответственно, который может быть сохранен в каждом
разделе. См. Раздел 17.3, "управление Разделом", для
получения дополнительной информации об этих опциях.
Некоторые преимущества разделения перечисляются здесь:
Разделение позволяет хранить больше данных в одной таблице, чем можно сохранить на единственном диске или разделе файловой системы.
Данные, которые теряют его полноценность, могут часто легко удаляться из разделенной таблицы, отбрасывая раздел (или разделы) содержащий только те данные. Наоборот, процесс добавления новых данных может в некоторых случаях быть значительно облегчен, добавляя один или более новые разделы для того, чтобы хранить определенно те данные.
Некоторые запросы могут быть значительно оптимизированы в силу факта что данные,
удовлетворяющие данный WHERE
пункт может быть сохранен только на одном или
более разделах, который автоматически, исключая любые остающиеся разделы от поиска. Поскольку разделы
могут быть изменены после того, как разделенная таблица была создана, можно реорганизовать свои данные,
чтобы улучшить частые запросы, которые не могли часто использоваться, когда схема выделения разделов
была сначала установлена. Эта возможность исключить несоответствие разделов (и таким образом любые
строки они содержат) часто упоминается как сокращение раздела. Для получения
дополнительной информации см. Раздел 17.4, "Сокращение Раздела".
Кроме того, MySQL 5.7 поддерживает явный выбор раздела для запросов. Например, SELECT * FROM t PARTITION (p0,p1) WHERE c < 5
выбирает только те
строки в разделах p0
и p1
то соответствие
WHERE
условие. В этом случае MySQL не проверяет никакие другие разделы
таблицы t
; это может значительно ускорить запросы, когда Вы уже знаете,
какой раздел или разделы Вы хотите исследовать. Выбор раздела также поддерживается для операторов
модификации данных DELETE
, INSERT
,
REPLACE
,
UPDATE
,
и LOAD DATA
, LOAD XML
. См. описания этих операторов для получения
дополнительной информации и примеров.
Другие преимущества, обычно связываемые с разделением, включают тех в следующий список. Эти опции в настоящий момент не реализуются в MySQL Partitioning, но высоки в нашем списке приоритетов.
Запросы, включающие агрегатные функции такой как SUM()
и COUNT()
может легко быть параллелизирован. Простой пример такого запроса
мог бы быть SELECT salesperson_id, COUNT(orders) as order_total FROM sales GROUP
BY salesperson_id;
. "Параллелизированным" мы подразумеваем, что запрос может
быть выполнен одновременно на каждом разделе, и окончательном результате, полученном просто, суммируя
результаты, полученные для всех разделов.
Достижение большей пропускной способности запроса в силу распространяющихся данных ищет по многократным дискам.
Убедитесь, что часто проверяли этот раздел и главу для обновлений, поскольку разработка MySQL Partitioning продолжается.