кодесурса
«MySQL

MySQL Partitioning

script1adsense2code
script1adsense3code

Что такое разделение?

Секционирование (метод проектирования баз данных) повышает производительность, управляемость, упрощает обслуживание и снижает затраты на хранение больших объемов данных. Разделение может быть достигнуто без разделения таблиц путем физического размещения таблиц на отдельных дисках. Секционирование позволяет разбивать таблицы, индексы и таблицы, организованные по индексу, на более мелкие части, поэтому запросы, которые обращаются только к части данных, могут выполняться быстрее, поскольку сканируется меньше данных. Существует две основные формы разбиения:

  • Горизонтальное разбиение: Горизонтальное разбиение делит строки таблицы на несколько разделов (на основе логики). Все столбцы, определенные для таблицы, находятся в каждом разделе, поэтому фактические атрибуты таблицы отсутствуют. Все разделы могут быть адресованы индивидуально или коллективно. Например, таблица, содержащая транзакцию продажи за весь год, разделенная по горизонтали на двенадцать отдельных разделов, где каждый раздел содержит данные за один месяц.
  • Вертикальное разбиение: Вертикальное разбиение делит таблицу на несколько таблиц, которые содержат меньше столбцов. Как и при горизонтальном разделении, при вертикальном разделении запроса сканируется меньше данных, что повышает производительность запроса. Например, таблица, содержащая несколько очень широких текстовых столбцов или столбцов BLOB, которые не адресованы, часто разбивается на две таблицы, в которых столбцы с наибольшим количеством ссылок в одной таблице и текстовые данные или данные BLOB в другой.

Разделение MySQL

Версия: MySQL 5.6

MySQL поддерживает базовое разбиение таблиц, но не поддерживает вертикальное разбиение (MySQL 5.6). В этом разделе подробно описывается, как реализовать разбиение как часть вашей базы данных.

Проверяя выходные данные оператора SHOW PLUGINS, вы будете уверены, поддерживает ли ваш сервер MySQL этот раздел или нет. Смотрите следующий вывод:

Пример вывода:

 mysql> ПОКАЗАТЬ ПЛАГИНОВ;
+ ---------------------------- + ---------- + --------- ----------- + --------- + --------- +
| Имя | Статус | Тип | Библиотека | Лицензия |
+ ---------------------------- + ---------- + --------- ----------- + --------- + --------- +
| бинлог | ACTIVE | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
| MySQL_native_password | АКТИВНЫЙ | АУТЕНТИФИКАЦИЯ | NULL | GPL |
| MySQL_old_password | ACTIVE | АУТЕНТИФИКАЦИЯ | NULL | GPL |
| sha256_password | АКТИВНЫЙ | АУТЕНТИФИКАЦИЯ | NULL | GPL |
| CSV | АКТИВНЫЙ | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
| ПАМЯТЬ | АКТИВНЫЙ | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
| MyISAM | ACTIVE | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
| MRG_MYISAM | ACTIVE | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
| АРХИВ | ACTIVE | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
| Черная дыра | ACTIVE | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
| ФЕДЕРАЦИЯ | ОТКЛЮЧЕНО | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
| InnoDB | ACTIVE | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
| INNODB_TRX | ACTIVE | ИНФОРМАЦИОННАЯ СХЕМА | NULL | GPL |
| INNODB_LOCKS | ACTIVE | ИНФОРМАЦИОННАЯ СХЕМА | NULL | GPL |
| INNODB_CMPMEM | АКТИВНЫЙ | ИНФОРМАЦИОННАЯ СХЕМА | NULL | GPL |
| --------------------------- | ------ | ------------------ | ---- | --- |
| --------------------------- | ------ | ------------------ | ---- | --- |
| --------------------------- | ------ | ------------------ | ---- | --- |
| INNODB_SYS_TABLESPACES | ACTIVE | ИНФОРМАЦИОННАЯ СХЕМА | NULL | GPL |
| INNODB_SYS_DATAFILES | АКТИВНЫЙ | ИНФОРМАЦИОННАЯ СХЕМА | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
| раздел | АКТИВНЫЙ | ХРАНЕНИЕ ДВИГАТЕЛЯ | NULL | GPL |
+ ---------------------------- + ---------- + --------- ----------- + --------- + --------- +
42 строки в наборе (0,21 сек)

Бинарные файлы сообщества MySQL 5.6 включают поддержку разметки.

Включить и отключить поддержку секционирования:

  • Чтобы включить разбиение (если вы компилируете MySQL 5.6 из исходного кода), сборка должна быть настроена с параметром -DWITH_PARTITION_STORAGE_ENGINE.
  • Чтобы отключить поддержку секционирования, вы можете запустить MySQL Server с параметром --skip-partition, в этом случае значение have_partitioning будет DISABLED.

Как разделить таблицу?

В MySQL вы можете разделить таблицу с помощью команды CREATE TABLE или ALTER TABLE. Смотрите следующий синтаксис CREATE TABLE:

 CREATE [TEMPORARY] TABLE [ЕСЛИ НЕ СУЩЕСТВУЕТ] tbl_name
(Create_definition, ...)
[table_options]
[partition_options]

partition_options:

 PARTITION BY
{[LINEAR] HASH (expr)
| [LINEAR] KEY (column_list)
| ДИАПАЗОН (выражение)
| LIST (expr)}
[PARTITIONS num]
[ПОДРАЗДЕЛЕНИЕ ПО
{[LINEAR] HASH (expr)
| [LINEAR] KEY (column_list)}
[ПОДРАЗДЕЛЕНИЯ num]
]
[(определение_раздела [, определение_раздела] ...)

partition_definition:

 PARTITION имя_раздела
[ЦЕННОСТИ 
{МЕНЬШЕ, ЧЕМ {(expr) | MAXVALUE} 
| 
IN (список_значений)}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'comment_text']
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
[NODEGROUP [=] node_group_id]
[(subpartition_definition [, subpartition_definition] ...)]

subpartition_definition:

 ПОДРАЗДЕЛЕНИЕ логическое_имя
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'comment_text']
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
[NODEGROUP [=] node_group_id]

ALTER TABLE: операции с разделами

Оператор ALTER TABLE может использоваться для добавления, удаления, объединения и разделения разделов, а также для выполнения обслуживания разделов. Здесь мы определили неразделенную таблицу:

CREATE TABLE sale_mast (
bill_no INT,
bill_date DATETIME
);

Эта таблица может быть разделена с помощью HASH (или другого типа), используя столбец bill_no в качестве ключа разделения, на 6 (или другие) разделов с помощью инструкции ALTER TABLE:

ALTER TABLE t1
    PARTITION BY HASH(id)
    PARTITIONS 6;

Наименование раздела:

Имена разделов следуют правилам других идентификаторов MySQL, таких как базы данных, таблицы, ограничения, хранимые процедуры и т. Д. Имена разделов не чувствительны к регистру.

Преимущества разбиения

  • Во время операции сканирования оптимизатор MySQL обращается к тем разделам, которые удовлетворяют конкретному запросу. Например, таблица записей о продажах за весь год может быть разбита на 4 раздела (т.е. данные о продажах за апрель-июнь (раздел p0), июль-сентябрь (раздел p1), октябрь-декабрь (раздел p2), Jam-Mar ( раздел p0)). Если выдается запрос, содержащий данные о продажах в период между июлем-сентябрем, он сканирует только раздел p1, а не итоговые записи таблицы, и запрос будет выполнен намного раньше.
  • Секционирование позволяет вам лучше контролировать, как данные управляются внутри базы данных. Например, вы можете отбросить определенные разделы в многораздельную таблицу, где данные теряют свою полезность. В некоторых случаях процесс добавления новых данных может быть значительно облегчен путем добавления одного или нескольких новых разделов для хранения этих данных с помощью команды ALTER TABLE.
  • При разделении можно хранить больше данных в одной таблице, чем может храниться на одном диске или в разделе файловой системы.
  • MySQL 5.6 поддерживает явный выбор разделов для запросов. Например, SELECT * FROM table1 PARTITION (p0, p1) WHERE col1 <10 выбирает только те строки в разделах p0 и p1, которые соответствуют условию WHERE, это может значительно ускорить запросы
  • Выбор разделов также поддерживает операторы модификации данных DELETE, INSERT, REPLACE, UPDATE и LOAD DATA, LOAD XML.

Типы разбиения MySQL

В MySQL 5.6 доступны следующие типы разбиения:

MySQL RANGE Partitioning

В MySQL режим разделения RANGE позволяет нам определять различные диапазоны, для которых назначаются данные. Диапазоны должны быть смежными, но не должны перекрываться и определяются с использованием оператора VALUES LESS THAN. В следующем примере таблица sale_mast содержит четыре столбца bill_no, bill_date, cust_code и amount. Эта таблица может быть разбита по диапазону различными способами, в зависимости от ваших требований. Здесь мы использовали столбец bill_date и решили разделить таблицу 4 способами, добавив предложение PARTITION BY RANGE. В этих разделах диапазон даты продажи (sale_date) следующий:

  • перегородка p0 (продажа с 01-01-2013 по 31-03-2013)
  • перегородка p1 (продажа с 01-04-2013 по 30-06-2013)
  • перегородка p2 (продажа с 01-07-2013 по 30-09-2013)
  • перегородка p3 (продажа с 01-10-2013 по 30-12-2013)

Давайте создадим таблицу:

 mysql> CREATE TABLE sale_mast (bill_no INT NOT NULL, bill_date TIMESTAMP NOT NULL, 
cust_code VARCHAR (15) NOT NULL, сумма DECIMAL (8,2) NOT NULL)  
PARTITION BY RANGE (UNIX_TIMESTAMP (bill_date)) (
PARTITION p0 ЗНАЧИТ МЕНЬШЕ, ЧЕМ (UNIX_TIMESTAMP ('2013-04-01')), 
PARTITION p1 ЗНАЧИТ МЕНЬШЕ, ЧЕМ (UNIX_TIMESTAMP ('2013-07-01')), 
PARTITION p2 ЗНАЧИТ МЕНЬШЕ, ЧЕМ (UNIX_TIMESTAMP ('2013-10-01')), 
PARTITION p3 ЗНАЧИТ МЕНЬШЕ, ЧЕМ (UNIX_TIMESTAMP ('2014-01-01')));
Запрос в порядке, затронуто 0 строк (1,50 с)

Теперь вставьте несколько записей в таблицу sale_mast:

 mysql> INSERT INTO sale_mast VALUES (1, '2013-01-02', 'C001', 125.56), 
(2, 2013-01-25, C003, 456.50), 
(3, 2013-02-15, C012, 365,00), 
(4, 2013-03-26, C345, 785.00), 
(5, 2013-04-19, C234, 656.00), 
(6, 2013-05-31, C743, 854.00), 
(7, 2013-06-11, C234, 542.00), 
(8, 2013-07-24, C003, 300,00), 
(8, 2013-08-02, C456, 475,20);
Запрос в порядке, затронуто 9 строк (0,07 с)
Записи: 9 Дубликаты: 0 Предупреждения: 0
mysql> SELECT * FROM sale_mast;
+ --------- + --------------------- + ----------- + ----- --- +
| bill_no | bill_date | cust_code | количество |
+ --------- + --------------------- + ----------- + ----- --- +
| 1 | 2013-01-02 00:00:00 | C001 | 125,56 |
| 2 | 2013-01-25 00:00:00 | C003 | 456.50 |
| 3 | 2013-02-15 00:00:00 | C012 | 365,00 |
| 4 | 2013-03-26 00:00:00 | C345 | 785,00 |
| 5 | 2013-04-19 00:00:00 | C234 | 656,00 |
| 6 | 2013-05-31 00:00:00 | C743 | 854,00 |
| 7 | 2013-06-11 00:00:00 | C234 | 542,00 |
| 8 | 2013-07-24 00:00:00 | C003 | 300,00 |
| 9 | 2013-08-02 00:00:00 | C456 | 475,20 |
+ --------- + --------------------- + ----------- + ----- --- +
9 рядов в наборе (0,00 сек) 

Вот статус раздела таблицы sale_mast:

 mysql> SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'sale_mast';
+ ---------------- + ------------ +
| PARTITION_NAME | TABLE_ROWS |
+ ---------------- + ------------ +
| p0 | 4 |
| p1 | 3 |
| p2 | 2 |
| р3 | 0 |
+ ---------------- + ------------ +
4 ряда в наборе (0,02 сек)

Вышеописанным способом вы можете разбить таблицу на основе суммы продажи (суммы. В этих разделах диапазон суммы продажи (суммы) следующий:

  • раздел p0 (сумма продажи <100)
  • раздел p1 (сумма продажи <500)
  • раздел p2 (сумма продажи <1000)
  • раздел p3 (объем продаж <1500)

Давайте создадим таблицу:

 mysql> CREATE TABLE sale_mast1 (bill_no INT NOT NULL, bill_date TIMESTAMP NOT NULL, 
cust_codE VARCHAR (15) NOT NULL, количество INT NOT NULL) 
РАЗДЕЛЕНИЕ ПО ДИАПАЗОНУ (сумма) (
РАЗДЕЛ p0 ЦЕННОСТЕЙ МЕНЬШЕ (100), 
РАЗДЕЛ p1 ЦЕННОСТЕЙ МЕНЬШЕ (500), 
РАЗДЕЛ p2 МЕНЬШЕ, ЧЕМ (1000), 
РАЗДЕЛ p3 ЗНАЧИТ МЕНЬШЕ, ЧЕМ (1500); 
Запрос в порядке, затронуто 0 строк (1,34 с)

Удалить раздел MySQL

Если вы чувствуете, что некоторые данные бесполезны в многораздельной таблице, вы можете удалить один или несколько разделов. Чтобы удалить все строки из раздела p0 sale_mast, вы можете использовать следующую инструкцию:

 MySQL> ALTER TABLE sale_mast TRUNCATE PARTITION p0;
Запрос в порядке, затронуто 0 строк (0,49 с) 
mysql> SELECT * FROM sale_mast;
+ --------- + --------------------- + ----------- + ----- --- +
| bill_no | bill_date | cust_code | количество |
+ --------- + --------------------- + ----------- + ----- --- +
| 5 | 2013-04-19 00:00:00 | C234 | 656,00 |
| 6 | 2013-05-31 00:00:00 | C743 | 854,00 |
| 7 | 2013-06-11 00:00:00 | C234 | 542,00 |
| 8 | 2013-07-24 00:00:00 | C003 | 300,00 |
| 9 | 2013-08-02 00:00:00 | C456 | 475,20 |
+ --------- + --------------------- + ----------- + ----- --- +
5 рядов в наборе (0,01 с) 

Вот состояние раздела sale_mast после удаления раздела p0:

 MySQL> SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'sale_mast';
+ ---------------- + ------------ +
| PARTITION_NAME | TABLE_ROWS |
+ ---------------- + ------------ +
| p0 | 0 |
| p1 | 3 |
| p2 | 2 |
| р3 | 0 |
+ ---------------- + ------------ +
4 ряда в наборе (0,05 сек)

MySQL LIST Partitioning

Разделение списка позволяет сегментировать данные на основе предварительно определенного набора значений (например, 1, 2, 3). Это делается с помощью PARTITION BY LIST (expr), где expr - это значение столбца, а затем определяется каждый раздел с помощью VALUES IN (value_list), где value_list - это список целых чисел, разделенных запятыми. В MySQL 5.6 можно сопоставить только список целых чисел (и, возможно, NULL) при разбиении по LIST. В следующем примере таблица sale_mast2 содержит четыре столбца bill_no, bill_date, agent_code и amount. Предположим, есть 11 агентов, представляющих три города A, B, C, они могут быть организованы в три раздела с разделением LIST следующим образом:

город Идентификатор агента
1, 2, 3
В 4, 5, 6
С 7, 8, 9, 10, 11

Давайте создадим таблицу:

 mysql> CREATE TABLE sale_mast2 (bill_no INT NOT NULL, bill_date TIMESTAMP NOT NULL,
agent_codE INT NOT NULL, сумма INT NOT NULL) 
PARTITION BY LIST (код_агента) (
РАЗДЕЛ ПА ЗНАЧЕНИЯ В (1,2,3), 
PARTITION pB ЗНАЧЕНИЯ В (4,5,6), 
PARTITION pC ЦЕННОСТИ В (7,8,9,10,11)); 
Запрос в порядке, затронуто 0 строк (1,17 с)

MySQL COLUMNS Partitioning

В разделе COLUMNS можно использовать несколько столбцов в ключах разделения. Существует два типа разделения COLUMNS:

Кроме того, как разделение RANGE COLUMNS, так и разделение LIST COLUMNS поддерживают использование нецелых столбцов для определения диапазонов значений или элементов списка. Разрешенные типы данных показаны в следующем списке:

Разделение RANGE COLUMNS и LIST COLUMNS поддерживает следующие типы данных для определения диапазонов значений или элементов списка.

  • Все целочисленные типы: TINYINT, SMALLINT, MEDIUMINT, INT (INTEGER) и BIGINT.
  • ДАТА и СРОКИ.

RANGE COLUMNS разделение

Разделение RANGE COLUMNS аналогично разделению по диапазонам с некоторыми существенными отличиями. RANGE COLUMNS принимает список из одного или нескольких столбцов в качестве ключей раздела. Вы можете определить диапазоны, используя различные столбцы типов (упомянутых выше), кроме целочисленных типов.

Вот основной синтаксис для создания таблицы, разделенной RANGE COLUMNS:

 CREATE TABLE table_name
РАЗДЕЛЕНО ДИАПАЗОНАМИ КОЛОНН (column_list) (
    PARTITION имя_раздела ЗНАЧИТ МЕНЬШЕ, ЧЕМ (список_значений) [,
    PARTITION имя_раздела ЗНАЧИТ МЕНЬШЕ, ЧЕМ (список_значений)] [,
    ...]
) 
column_list:
    имя-столбца [, имя-столбца] [, ...]
value_list:
    значение [, значение] [, ...]
  • column_list - это список из одного или нескольких столбцов.
  • value_list представляет собой список значений и должен быть предоставлен для каждого определения раздела.
  • список столбцов и список значений, определяющий каждый раздел, должны находиться в том же порядке
  • Порядок имен столбцов в списке столбцов разделения и списках значений не должен совпадать с порядком определений столбцов таблицы в операторе CREATE TABLE.

Вот пример:

 mysql> CREATE TABLE table3 (col1 INT, col2 INT, col3 CHAR (5), col4 INT)
РАЗДЕЛЕНИЕ ПО ДИАПАЗОНАМ КОЛОНН (col1, col2, col3) 
 (РАЗДЕЛ p0 ЗНАЧИТ МЕНЬШЕ, ЧЕМ (50, 100, «а-а-а-а-а»), 
 РАЗДЕЛ p1 ЗНАЧИТ МЕНЬШЕ, ЧЕМ (100 200, «bbbbb»), 
 РАЗДЕЛ p2 МЕНЬШЕ, ЧЕМ (150 300, «ccccc»), 
 РАЗДЕЛ p3 ЗНАЧИТ МЕНЬШЕ, ЧЕМ (MAXVALUE, MAXVALUE, MAXVALUE));
Запрос в порядке, затронуто 0 строк (1,39 с)

В приведенном выше примере -

  • Таблица table3 содержит столбцы col1, col2, col3, col4
  • Первые три столбца участвовали в разбиении предложения COLUMNS, в порядке col1, col2, col3.
  • Каждый список значений, используемый для определения раздела, содержит 3 значения в том же порядке и (INT, INT, CHAR (5)).

LIST COLUMNS разделение

LIST COLUMNS принимает список из одного или нескольких столбцов в качестве ключей разделения. Вы можете использовать различные столбцы данных типов, отличных от целочисленных, в качестве столбцов разделения. Вы можете использовать строковые типы, столбцы DATE и DATETIME.

В компании есть агенты в 3 городах, для продаж и маркетинга. Мы организовали агентов в 3 городах, как показано в следующей таблице:

город Идентификатор агента
А1, А2, А3
В B1, B2, B3
С С1, С2, С3, С4, С5

Давайте создадим таблицу с LIST COLUMNS-разделением на основе приведенной выше информации:

 mysql> CREATE TABLE salemast (agent_id VARCHAR (15), имя_агента VARCHAR (50), 
агент_адрес VARCHAR (100), код города VARCHAR (10) 
PARTITION BY LIST COLUMNS (agent_id) ( 
PARTITION pcity_a VALUES IN ('A1', 'A2', 'A3'), 
PARTITION pcity_b VALUES IN ('B1', 'B2', 'B3'), 
PARTITION pcity_c VALUES IN ('C1', 'C2', 'C3', 'C4', 'C5'));
Запрос в порядке, затронуто 0 строк (1,06 с)

Вы можете использовать столбцы DATE и DATETIME в разделах LIST COLUMNS, см. Следующий пример:

 CREATE TABLE sale_master (bill_no INT NOT NULL, bill_date DATE, 
cust_code VARCHAR (15) NOT NULL, сумма DECIMAL (8,2) NOT NULL)  
РАЗДЕЛЕНИЕ ПО ДИАПАЗОНАМ КОЛОНН (bill_date) (
PARTITION p_qtr1 ЗНАЧИТ МЕНЬШЕ, ЧЕМ ('2013-04-01'), 
PARTITION p_qtr2 ЗНАЧИТ МЕНЬШЕ, ЧЕМ ('2013-07-01'), 
PARTITION p_qtr3 ЗНАЧИТ МЕНЬШЕ, ЧЕМ ('2013-10-01'), 
PARTITION p_qtr4 ЗНАЧИТ МЕНЬШЕ, ЧЕМ ('2014-01-01'));

MySQL HASH Partitioning

HASH-раздел MySQL используется для распределения данных между предварительно определенным числом разделов по значению столбца или выражению на основе значения столбца. Это делается с помощью предложения PARTITION BY HASH (expr), добавляя в CREATE TABLE STATEMENT. В разделе PARTITIONS num num - положительное целое число, представляющее количество разделов таблицы. Следующий оператор создает таблицу, которая использует хеширование в столбце studetn_id и разделена на 4 раздела:

MySQL>CREATE TABLE student (student_id INT NOT NULL, 
class VARCHAR(8), name VARCHAR(40),
date_of_admission DATE NOT NULL DEFAULT '2000-01-01') 
PARTITION BY HASH(student_id) 
PARTITIONS 4;
Query OK, 0 rows affected (1.43 sec)

Также возможно сделать раздел на основе года, в котором студент был принят. Смотрите следующее утверждение:


MySQL> CREATE TABLE student (student_id INT NOT NULL, 
class VARCHAR(8), class VARCHAR(8), name VARCHAR(40),
date_of_admission DATE NOT NULL DEFAULT '2000-01-01') 
PARTITION BY HASH(YEAR(date_of_admission)) 
PARTITIONS 4;
Query OK, 0 rows affected (1.27 sec)

MySQL KEY Partitioning

Раздел MySQL KEY - это особая форма раздела HASH, где функция хеширования для разделения ключей предоставляется сервером MySQL. Сервер использует свою собственную внутреннюю функцию хеширования, которая основана на том же алгоритме, что и PASSWORD (). Это делается с помощью PARTITION BY KEY, добавляя в CREATE TABLE STATEMENT. В разделе KEY KEY принимает только список из нуля или более имен столбцов. Любые столбцы, используемые в качестве ключа разделения, должны содержать часть или весь первичный ключ таблицы, если она есть у таблицы. Если в таблице есть первичный ключ, он используется в качестве ключа разделения, если в качестве ключа разделения не указан столбец. Вот пример:

 MySQL> CREATE TABLE table1 (id INT NOT NULL PRIMARY KEY, 
имя VARCHAR (25), имя VARCHAR (25) 
РАЗДЕЛЕНИЕ КЛЮЧОМ () 
РАЗДЕЛЫ 2;
Запрос в порядке, затронуто 0 строк (0,84 с)

Если первичного ключа нет, но в таблице есть уникальный ключ, то для ключа разделения используется уникальный ключ:

 MySQL> CREATE TABLE table2 (идентификатор INT NOT NULL, fname VARCHAR (25), 
ИМЯ ВАРЧАР (25), 
УНИКАЛЬНЫЙ КЛЮЧ (id)) 
РАЗДЕЛЕНИЕ ПО КЛЮЧУ () 
РАЗДЕЛЫ 2;
Запрос в порядке, затронуто 0 строк (0,77 с)

Подразделение MySQL

Подразделение - это метод дальнейшего разделения каждого раздела в многораздельной таблице. Смотрите следующий оператор CREATE TABLE:

CREATE TABLE table10 (BILL_NO INT, sale_date DATE, cust_code VARCHAR(15), 
AMOUNT DECIMAL(8,2))
PARTITION BY RANGE(YEAR(sale_date) )
SUBPARTITION BY HASH(TO_DAYS(sale_date))
SUBPARTITIONS 4 (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN (2010),
PARTITION p3 VALUES LESS THAN MAXVALUE
);

В приведенном выше заявлении -

  • Таблица имеет 4 диапазона RANGE.
  • Каждый из этих разделов - p0, p1, p2 и p3 - дополнительно делится на 4 подраздела.
  • Поэтому вся таблица делится на 4 * 4 = 16 разделов.

Вот статус раздела таблицы 10:

 mysql> SELECT PARTITION_NAME, TABLE_ROWS FROM 
INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'stable';
+ ---------------- + ------------ +
| PARTITION_NAME | TABLE_ROWS |
+ ---------------- + ------------ +
| p0 | 0 |
| p0 | 0 |
| p0 | 0 |
| p0 | 0 |
| p1 | 0 |
| p1 | 0 |
| p1 | 0 |
| p1 | 0 |
| p2 | 0 |
| p2 | 0 |
| p2 | 0 |
| p2 | 0 |
| р3 | 0 |
| р3 | 0 |
| р3 | 0 |
| р3 | 0 |
+ ---------------- + ------------ +
16 рядов в наборе (0,16 с)

Предыдущий: MySQL ALTER TABLE
Далее: MySQL INSERT

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code