Паутов Алексей В.
Шрифт:
Из-за этого эта обработка NULL изменяется при выделении разделов различных типов, и может производить поведение, которое Вы не ожидаете. Если Вы вставляете строку в таблицу, разбитую на разделы RANGE так, что значение столбца, используемое, чтобы определить раздел, является NULL, строка вставлена в самый нижний раздел. Например, рассмотрите эти две таблицы, созданные и заполняемые следующим образом:
mysql> CREATE TABLE t1 (c1 INT, c2 VARCHAR(20))
– > PARTITION BY RANGE(c1) (
– > PARTITION p0 VALUES LESS THAN (0),
– > PARTITION p1 VALUES LESS THAN (10),
– > PARTITION p2 VALUES LESS THAN MAXVALUE);
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE TABLE t1 (c1 INT, c2 VARCHAR(20))
– > PARTITION BY RANGE(c1) (
– > PARTITION p0 VALUES LESS THAN (-5),
– > PARTITION p1 VALUES LESS THAN (0),
– > PARTITION p1 VALUES LESS THAN (10),
– > PARTITION p2 VALUES LESS THAN MAXVALUE);
Query OK, 0 rows affected (0.09 sec)
mysql> INSERT INTO t1 VALUES (NULL, 'mothra');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO t2 VALUES (NULL, 'mothra');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM t1;
+------+--------+
| id | name |
+------+--------+
| NULL | mothra |
+------+--------+
1 row in set (0.00 sec)
mysql> SELECT * FROM t2;
+------+--------+
| id | name |
+------+--------+
| NULL | mothra |
+------+--------+
1 row in set (0.00 sec)
Вы можете видеть, в который раздел строки сохранены, осматривая файловую систему и сравнивая размеры .MYD-файлов:
/var/lib/mysql/test> ls -l *.MYD
– rw-rw---- 1 mysql mysql 20 2006-03-10 03:27 t1#P#p0.MYD
– rw-rw---- 1 mysql mysql 0 2006-03-10 03:17 t1#P#p1.MYD
– rw-rw---- 1 mysql mysql 0 2006-03-10 03:17 t1#P#p2.MYD
– rw-rw---- 1 mysql mysql 20 2006-03-10 03:27 t2#P#p0.MYD
– rw-rw---- 1 mysql mysql 0 2006-03-10 03:17 t2#P#p1.MYD
– rw-rw---- 1 mysql mysql 0 2006-03-10 03:17 t2#P#p2.MYD
– rw-rw---- 1 mysql mysql 0 2006-03-10 03:17 t2#P#p3.MYD
Файлы разделов именованы согласно формату table_name#P#partition_name .extension так, чтобы t1#P#p0.MYD был файлом, в котором сохранены данные, принадлежащие к разделу p0 таблицы t1. Обратите внимание: до MySQL 5.1.5, эти файлы были бы именованы соответственно t1_p0.MYD и t2_p0.MYD.
Вы можете также показывать, что эти строки были сохранены в самом низком разделе каждой таблицы, удаляя эти разделы, а затем делая повторный запуск инструкций SELECT:
mysql> ALTER TABLE t1 DROP PARTITION p0;
Query OK, 0 rows affected (0.16 sec)
mysql> ALTER TABLE t2 DROP PARTITION p0;
Query OK, 0 rows affected (0.16 sec)
mysql> SELECT * FROM t1;
Empty set (0.00 sec)
mysql> SELECT * FROM t2;
Empty set (0.00 sec)
Такая обработка также верна для выделения разделов с помощью выражений через использование функций SQL. Предположите, что мы имеем таблицу:
CREATE TABLE tndate (id INT, dt DATE) PARTITION BY RANGE(YEAR(dt)) (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN MAXVALUE);
Как с другими функциями MySQL, YEAR(NULL) вернет NULL. Строка со значением NULL столбца dt обрабатывается, как если бы выражение выделения разделов было оценено к значению меньше, чем любое другое значение, и так вставлено в раздел p0.
Таблица, которая разбита на разделы LIST допускает значения NULL если (и только если!) один из разделов определен, используя список значений, который содержит NULL. Таблица, разбитая на разделы LIST, которая явно не использует NULL в списке значений, отклоняет строки, приводящие к значению NULL для выражения выделения разделов, как показано в этом примере:
mysql> CREATE TABLE ts1 (c1 INT, c2 VARCHAR(20))
– > PARTITION BY LIST(c1) (
– > PARTITION p0 VALUES IN (0, 3, 6),