ца. Если не задана ни одна из вышеупомянутых опций, то максимальный размер таблицы
будет составлять 4Гб (или 2Гб, если данная операционная система поддерживает только та-
блицы величиной до 2Гб). Это делается для того, чтобы (если нет реальной необходимости
в больших файлах), ограничить размеры указателей, что позволит сделать индексы меньше
и быстрее. Если опция
PACK_KEYS
не используется, то по умолчанию уплотняются толь-
ко строки, но не числа. При использовании
PACK_KEYS=1
числа тоже будут уплотнять-
ся. При уплотнении двоичных числовых ключей MySQL будет использовать сжатие пре-
фиксов. Это
означает, что выгода от этого будет значительной только в случае большого ко-
личества одинаковых чисел. При сжатии префиксов для каждого ключа требуется один до-
полнительный байт, в котором указано, сколько байтов предыдущего ключа являются таки-
ми же, как и для следующего (следует учитывать, что указатель на строку хранится в поряд-
ке "старший-байт-в-начале", сразу после ключа, - чтобы улучшить компрессию). Это озна-
чает, что при наличии нескольких одинаковых ключей в двух строках записи все последую-
щие ''аналогичные'' ключи будут занимать только по 2 байта (включая указатель строки).
Сравним: в обычном случае для хранения последующих ключей требуется
размер_хранения_ключа + размер_указателя (обычно 4)
байтов.
С другой стороны, если все ключи абсолютно разные, каждый ключ будет занимать на 1
байт больше, если данный ключ не может иметь величину
NULL
(в этом случае уплотнен-
ный ключ будет храниться в том же байте, который используется для указания, что ключ
равен
NULL
).
Если после команды
CREATE
указывается команда
SELECT
, то MySQL создаст
новые поля для всех
элементов в данной команде
SELECT
. Например:
mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (a), KEY(b))
TYPE=MyISAM SELECT b,c FROM test2;
Эта команда создаст таблицу
MyISAM
с тремя столбцами:
a
,
b
и
c
. Отметим, что
столбцы из команды
SELECT
присоединяются к таблице справа, а не перекрывают ее.
Рассмотрим следующий пример:
mysql> SELECT * FROM foo;
+---+
| n |
+---+
| 1 |
+---+
mysql> CREATE TABLE bar (m INT)
SELECT n FROM foo;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM bar;
+------+---+
| m | n |
+------+---+
| NULL | 1 |
+------+---+
1 row in set (0.00 sec)
Каждая строка в таблице
foo
вносится в таблицу
bar
со своим значением из
foo
,
при этом в новые столбцы в таблице
bar
записываются величины, заданные по умолча-
нию. Команда
CREATE TABLE ... SELECT
не создает автоматически каких-либо
индексов. Это сделано преднамеренно, чтобы команда была настолько гибкой, насколько
возможно. Чтобы иметь индексы в созданной таблице, необходимо указать их перед данной
командой
SELECT
:
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
68
Если возникает ошибка при копировании данных в таблицу, то они будут автомати-
чески удалены. Чтобы обеспечить возможность использовать для восстановления таблиц
журнал обновлений/двоичный журнал, в MySQL во время выполнения команды
CREATE
TABLE ... SELECT
не разрешены параллельные вставки.
Достарыңызбен бөлісу: