7.2 Таблицы MERGE
Таблицы MERGE
(объединение) являются новшеством версии MySQL 3.23.25. В
настоящее время код находится еще на стадии разработки, но, тем не менее,
должен быть достаточно стабилен.
Таблица MERGE
(или таблица MRG_MyISAM
) представляет собой совокупность
идентичных таблиц MyISAM
, которые могут использоваться как одна таблица. К
совокупности таблиц можно применять только команды SELECT
, DELETE
и
UPDATE
. Если же попытаться применить к таблице MERGE
команду DROP
, она
подействует только на определение MERGE
.
Обратите внимание на то, что команда DELETE FROM merge_table
без параметра
WHERE
очищает только распределение для таблицы, но ничего не удаляет из
распределенных таблиц (мы планируем исправить это в версии 4.1).
Под идентичными таблицами подразумеваются таблицы, созданные с одинаковой
структурой и ключами. Нельзя объединять таблицы, в которых столбцы сжаты
разными методами или не совпадают, либо ключи расположены в другом
порядке. Тем не менее, некоторые таблицы можно сжимать при помощи команды
myisampack
. See section 4.7.4 myisampack
, MySQL-генератор сжатых таблиц (только для чтения).
При создании таблицы MERGE
будут образованы файлы определений таблиц `.frm'
и списка таблиц `.MRG'. Файл `.MRG' содержит список индексных файлов (файлы
`.MYI'), работа с которыми должна осуществляться как с единым файлом. Все
используемые таблицы должны размещаться в той же базе данных, что и
таблица MERGE
.
На данный момент по отношению к таблицам, которые необходимо преобразовать
в таблицу MERGE
,необходимо обладать привилегиями SELECT
, UPDATE
и DELETE
.
Ниже перечислены возможности, которые обеспечивают таблицы MERGE
:
-
Простое управление набором файлов журналов. Например, можно поместить
данные за различные месяцы в отдельные файлы, сжать некоторые из них
при помощи
myisampack
, а затем создать таблицу MERGE
, чтобы
использовать их как одну таблицу.
-
Увеличение скорости работы. Большую таблицу можно разделить по
некоторому критерию, а затем поместить различные части таблицы на
разные диски. В этом случае таблица
MERGE
может обрабатываться намного
быстрее, чем обычная большая таблица (можно, конечно, воспользоваться
дисковым массивом RAID
, чтобы получить те же преимущества).
-
Более эффективный поиск. Если точно известно, что вы ищете, можно
производить поиск по определенным запросам только в одной из
составляющих таблицу
MERGE
таблиц, одновременно используя таблицу
MERGE
для других запросов. Можно даже иметь несколько активных таблиц
MERGE
(возможно, с перекрывающимися файлами).
-
Более простое восстановление. Гораздо легче восстановить отдельные
файлы, которые преобразованы в файл
MERGE
, чем пытаться восстановить
действительно большой файл.
-
Быстрая обработка большого количества файлов как одного. Для таблицы
MERGE
используются индексы отдельных таблиц; поддерживать для нее один
большой индекс нет необходимости. Благодаря этому создание или
изменение таблиц MERGE
осуществляется ОЧЕНЬ быстро. Обратите внимание
на то, что при создании таблицы MERGE
необходимо указывать определения
ключей!
-
Если требуется объединить несколько таблиц в одну большую таблицу по
требованию или при формировании, лучше создать для них по требованию
таблицу
MERGE
. Это намного быстрее и позволит сэкономить дисковое
пространство.
-
Таблицы
MERGE
позволяют обходить ограничения на размер файлов в
операционных системах.
-
Можно создать псевдоним/синоним для таблицы - для этого нужно просто
применить
MERGE
к одной таблице. Заметного падения производительности
при этом наблюдаться не будет (только пара непрямых вызовов и вызовы
memcpy()
при каждом чтении).
Недостатки таблиц MERGE
:
-
Для создания таблицы
MERGE
можно использовать только идентичные
таблицы MyISAM
.
-
Столбцы
AUTO_INCREMENT
не обновляются автоматически при применении
команды INSERT
.
-
Не работает команда
REPLACE
.
-
Для таблиц
MERGE
используется больше дескрипторов файлов. Если
применяется таблица MERGE
, преобразованная из более чем 10 таблиц, к
которым получают доступ 10 пользователей, то используется 10*10 + 10
дескрипторов файлов (10 файлов данных для 10 пользователей и 10 общих
индексных файлов).
-
Ключи считываются медленнее. При чтении ключа обработчику
MERGE
необходимо прочитать все базовые таблицы, чтобы выяснить, какая из них
больше всего соответствует указанному ключу. Если после этого
выполнить команду ``читать следующий'', то обработчик объединенной
таблицы должен будет просмотреть буферы чтения, чтобы найти следующий
ключ. Только по завершении использования одного буфера ключей
обработчику понадобится прочитать следующий блок ключей. В связи с
этим ключи MERGE
дают большое замедление при поиске eq_ref
, однако не
такое значительное при поиске ref
. See section 5.2.1 Синтаксис оператора EXPLAIN
(получение информации о SELECT
).
-
Нельзя выполнять команды
DROP TABLE
, ALTER TABLE
или DELETE FROM
table_name
без оператора WHERE
по отношению к таблицам, которые
размещены в таблице MERGE
и открыты. Если это сделать, в таблице MERGE
останутся ссылки на исходную таблицу, и полученные результаты будут
совершенно непредсказуемыми.
При создании таблицы MERGE
необходимо указать при помощи
UNION(list-of-tables)
, какие таблицы требуется использовать как одну. В
случае необходимости, если требуется производить вставку в таблицу MERGE
в
первую или в последнюю таблицу в списке UNION
, можно задать
INSERT_METHOD
. Если не указать INSERT_METHOD
или выбрать NO
, то все
команды INSERT
для таблицы MERGE
будут выдавать ошибку.
В приведенном ниже примере показано, как использовать таблицы MERGE
:
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2");
CREATE TABLE total (a INT NOT NULL, message CHAR(20), KEY(a))
TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
Обратите внимание на то, что мы не создавали UNIQUE
или PRIMARY KEY
в
таблице total
, так как в этой таблице ключ не будет уникальным.
Кроме того, можно управлять файлом `.MRG', находясь за пределами сервера
MySQL:
shell> cd /mysql-data-directory/current-database
shell> ls -1 t1.MYI t2.MYI > total.MRG
shell> mysqladmin flush-tables
Теперь можно выполнять следующие действия:
mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table |
| 3 | t1 |
| 1 | Testing |
| 2 | table |
| 3 | t2 |
+---+---------+
Чтобы повторно преобразовать таблицу MERGE
, можно выбрать один из
следующих вариантов:
-
Применить к таблице команду
DROP
и создать ее повторно
-
Воспользоваться командой
ALTER TABLE table_name UNION(...)
-
Изменить файл `.MRG' и выполнить команду
FLUSH TABLE
над таблицей MERGE
и всеми базовыми таблицами, чтобы обработчик прочитал новый файл
определения.
Главы