MySQL: руководство профессионала
Шрифт:
var/lib/mysql/test> ls *.MYD -l
– rw-rw---- 1 mysql mysql 20 2005-11-04 18:44 th#P#p0.MYD
– rw-rw---- 1 mysql mysql 0 2005-11-04 18:41 th#P#p1.MYD
Вы можете видеть, что инструкция INSERT изменила только файл th#P#p0.MYD (увеличение размера на диске) без того, чтобы воздействовать на другой файл данных.
Важно: до MySQL 5.1.8 выделение разделов по RANGE значение выражения выделения разделов NULL работало как 0 (единственный способ обходить это должен был
3.3. Управление разделами
MySQL 5.1 обеспечивает ряд способов изменить разбитые на разделы таблицы. Возможно добавлять, удалять, переопределять, объединять или расчленять существующие разделы. Все эти действия могут быть выполнены, используя расширения выделения разделов к команде ALTER TABLE. Имеются также способы получить информацию относительно разбитых на разделы таблиц и разделов.
Обратите внимание: в MySQL 5.1 все разделы разбитой на разделы таблицы должны иметь то же самое число подразделов, и невозможно изменить подвыделение разделов, если только таблица была создана.
Инструкция ALTER TABLE … PARTITION BY … доступна с MySQL 5.1.6, предварительно, в MySQL 5.1, это было принято как допустимый синтаксис, но инструкция не делала ничего.
Чтобы изменять схему выделения разделов таблицы, необходимо использовать команду ALTER TABLE с предложением partition_options. Это предложение имеет тот же самый синтаксис, как то, что используется с CREATE TABLE для создания разбитой на разделы таблицы, и всегда начинается с ключевых слов PARTITION BY. Например, предположите, что Вы имеете таблицу, разбитую на разделы диапазоном, использующим следующую инструкцию CREATE TABLE:
CREATE TABLE trb3 (id INT, name VARCHAR(50), purchased DATE)
PARTITION BY RANGE(YEAR(purchased)) (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (1995),
PARTITION p2 VALUES LESS THAN (2000),
PARTITION p3 VALUES LESS THAN (2005));
Чтобы заново выделять разделы этой таблицы так, чтобы это было разбито на разделы ключом на два раздела, использующие значение столбца id как основание для ключа, Вы можете использовать эту инструкцию:
ALTER TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2;
Это имеет тот же самый эффект на структуре таблицы как удаление таблицы и создания ее вновь, используя CREATE TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2;.
Важно: в MySQL 5.1.7 и ранее ALTER TABLE … ENGINE = … удаляет все выделение разделов из обрабатываемой таблицы. Начиная с MySQL 5.1.8, этот оператор меняет только тип памяти, используемый таблицей, и оставляет схему выделения разделов таблицы неповрежденной. С MySQL 5.1.8 применяйте ALTER TABLE … REMOVE PARTITIONING, чтобы удалить выделение разделов таблицы.
3.3.1. Управление разделами RANGE и LIST
Разделы диапазона и списка очень похожи относительно того, как обработано добавление и удаление разделов. По этой причине мы обсуждаем здесь управление обеими сортами выделения разделов.
Удаление раздела из таблицы, которая разбита на разделы RANGE или LIST может быть выполнено, используя инструкцию ALTER TABLE с предложением DROP PARTITION. Имеется базисный пример, который предполагает, что Вы уже создали таблицу, которая разбита на разделы диапазоном и затем заполняется 10 записями, использующими следующие инструкции CREATE TABLE и INSERT:
mysql> CREATE TABLE tr (id INT, name VARCHAR(50), purchased DATE)
– > PARTITION BY RANGE(YEAR(purchased)) (
– > PARTITION p0 VALUES LESS THAN (1990),
– > PARTITION p1 VALUES LESS THAN (1995),
– > PARTITION p2 VALUES LESS THAN (2000),
– > PARTITION p3 VALUES LESS THAN (2005));
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO tr VALUES
– > (1, 'desk organiser', '2003-10-15'),
– > (2, 'CD player', '1993-11-05'),
– > (3, 'TV set', '1996-03-10'),
– > (4, 'bookcase', '1982-01-10'),
– > (5, 'exercise bike', '2004-05-09'),
– > (6, 'sofa', '1987-06-05'),
– > (7, 'popcorn maker', '2001-11-22'),
– > (8, 'aquarium', '1992-08-04'),
– > (9, 'study desk', '1984-09-16'),
– > (10, 'lava lamp', '1998-12-25');
Query OK, 10 rows affected (0.01 sec)
Вы можете видеть, которые элементы должны быть вставлены в раздел p2 как показано здесь:
mysql> SELECT * FROM tr WHERE purchased BETWEEN '1995-01-01' AND '1999-12-31';
+----+-----------+------------+
| id | name | purchased |
+----+-----------+------------+
| 3 | TV set | 1996-03-10 |
| 10 | lava lamp | 1998-12-25 |
+----+-----------+------------+
2 rows in set (0.00 sec)
Чтобы удалить раздел p2, выполните следующую команду:
mysql> ALTER TABLE tr DROP PARTITION p2;
Query OK, 0 rows affected (0.03 sec)
Обратите внимание: в MySQL 5.1 NDB Cluster не поддерживает ALTER TABLE … DROP PARTITION. Это, однако, поддерживает другие связанные с выделением разделов расширения ALTER TABLE, которые описаны в этой главе.
Очень важно не забыть, что, когда Вы удаляете раздел, Вы также удаляете все данные, которые был сохранены в этом разделе. Вы можете видеть, что дело обстоит именно так, делая повторный запуск предыдущего запроса SELECT:
SELECT * FROM tr WHERE purchased BETWEEN '1995-01-01' AND '1999-12-31';