Таблицы 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без оператораWHEREREPAIR 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и всеми базовыми таблицами, чтобы обработчик прочитал новый файл определения.