Таблицы MERGE
(объединение) являются новшеством версии MySQL 3.23.25. В
настоящее время код находится еще на стадии разработки, но, тем не менее,
должен быть достаточно стабилен.
Таблица MERGE
(или таблица MRG_MyISAM
) представляет собой совокупность
идентичных таблиц MyISAM
, которые могут использоваться как одна таблица. К
совокупности таблиц можно применять только команды SELECT
, DELETE
и
UPDATE
. Если же попытаться применить к таблице MERGE
команду DROP
, она
подействует только на определение MERGE
.
Обратите внимание на то, что команда DELETE FROM merge_table
без параметра
WHERE
очищает только распределение для таблицы, но ничего не удаляет из
распределенных таблиц (мы планируем исправить это в версии 4.1).
Под идентичными таблицами подразумеваются таблицы, созданные с одинаковой
структурой и ключами. Нельзя объединять таблицы, в которых столбцы сжаты
разными методами или не совпадают, либо ключи расположены в другом
порядке. Тем не менее, некоторые таблицы можно сжимать при помощи команды
myisampack
. See Раздел 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
.Не работает команда
REPLACE
.Для таблиц
MERGE
используется больше дескрипторов файлов. Если применяется таблицаMERGE
, преобразованная из более чем 10 таблиц, к которым получают доступ 10 пользователей, то используется 10*10 + 10 дескрипторов файлов (10 файлов данных для 10 пользователей и 10 общих индексных файлов).Ключи считываются медленнее. При чтении ключа обработчику
MERGE
необходимо прочитать все базовые таблицы, чтобы выяснить, какая из них больше всего соответствует указанному ключу. Если после этого выполнить команду ``читать следующий'', то обработчик объединенной таблицы должен будет просмотреть буферы чтения, чтобы найти следующий ключ. Только по завершении использования одного буфера ключей обработчику понадобится прочитать следующий блок ключей. В связи с этим ключиMERGE
дают большое замедление при поискеeq_ref
, однако не такое значительное при поискеref
. See Раздел 5.2.1, «Синтаксис оператораEXPLAIN
(получение информации оSELECT
)».Нельзя выполнять команды
DROP TABLE
,ALTER TABLE
,DELETE FROM table_name
без оператораWHERE
REPAIR TABLE
,TRUNCATE TABLE
,OPTIMIZE TABLE
, илиANALYZE TABLE
по отношению к таблицам, которые размещены в таблицеMERGE
и открыты. Если это сделать, в таблицеMERGE
останутся ссылки на исходную таблицу, и полученные результаты будут совершенно непредсказуемыми. Самый легкий путь обойти эти трудности - выполнить коммандуFLUSH TABLES
. Это удостоверит, что ни одна таблица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 AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
Кроме того, можно управлять файлом .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 | +---+---------+
Обратите внимание на то, что столбец a
, хотя и объявлен как
PRIMARY KEY
, не является уникальным, так как таблица MERGE
не может
обеспечивать уникальность для всех таблиц MyISAM
.
Чтобы повторно преобразовать таблицу MERGE
, можно выбрать один из
следующих вариантов:
Применить к таблице команду
DROP
и создать ее повторноВоспользоваться командой
ALTER TABLE table_name UNION(...)
Изменить файл
.MRG
и выполнить командуFLUSH TABLE
над таблицейMERGE
и всеми базовыми таблицами, чтобы обработчик прочитал новый файл определения.