18.7 Двигатель MERGE-хранилища
Двигатель хранения MERGE, также известный как двигатель MRG_MyISAM, представляет собой набор идентичных MyISAM таблиц, которые могут использоваться как одна. “Идентичные” означает, что все таблицы имеют одинаковые типы данных столбцов и информацию об индексах. Вы не можете объединить MyISAM таблицы, в которых столбцы перечислены в другом порядке, не имеют точно таких же типов данных в соответствующих столбцах или имеют индексы в другом порядке. Однако все или некоторые из MyISAM таблиц могут быть сжаты с помощью myisampack. См. Раздел 6.6.6, «myisampack — Генерация сжатых, только для чтения таблиц MyISAM». Различия между таблицами, такими как эти, не имеют значения:
Имена соответствующих столбцов и индексов могут отличаться.
Комментарии к таблицам, столбцам и индексам могут отличаться.
Параметры таблицы, такие как
AVG_ROW_LENGTH,MAX_ROWSилиPACK_KEYS, могут отличаться.
Альтернативой таблице MERGE является разнесенная таблица, которая хранит разделы одной таблицы в отдельных файлах и позволяет более эффективно выполнять некоторые операции. Дополнительная информация приведена в Главе 26, Разбиение.
При создании таблицы MERGE MySQL создает на диске файл .MRG, содержащий имена базовых MyISAM таблиц, которые должны использоваться как одна. Формат таблицы MERGE таблицы хранится в словаре данных MySQL. Базовые таблицы не обязательно должны находиться в той же базе данных, что и таблица MERGE.
Вы можете использовать SELECT, DELETE, UPDATE и INSERT с таблицами MERGE. У вас должны быть SELECT, DELETE и UPDATE разрешения на MyISAM таблицы, которые вы отображаете в таблицу MERGE.
Использование таблиц MERGE влечёт за собой следующую проблему безопасности: если у пользователя есть доступ к таблице MyISAM t, этот пользователь может создать таблицу MERGE m, которая обращается к t. Однако, если права пользователя на t впоследствии будут отозваны, пользователь сможет продолжить доступ к t, сделав это через m.
Использование DROP TABLE с таблицей MERGE удаляет только спецификацию MERGE. Базовые таблицы не затрагиваются.
Для создания таблицы MERGE вы должны указать параметр UNION=(, который указывает, какие list-of-tables)MyISAM таблицы использовать. Вы можете дополнительно указать параметр INSERT_METHOD, чтобы управлять тем, как происходят вставки в таблицу MERGE. Используйте значение FIRST или LAST, чтобы вставки производились в первую или последнюю базу данных соответственно. Если вы не указываете параметр INSERT_METHOD или указываете его со значением NO, вставки в таблицу MERGE запрещены, и попытки сделать это приведут к ошибке.
Следующий пример демонстрирует, как создать таблицу MERGE:
mysql> CREATE TABLE t1 (
-> a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
-> a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> message CHAR(20)) ENGINE=MyISAM;
mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql> CREATE TABLE total (
-> a INT NOT NULL AUTO_INCREMENT,
-> message CHAR(20), INDEX(a))
-> ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
Столбец a индексируется как PRIMARY
KEY в базовых MyISAM таблицах, но не в таблице MERGE. Там он индексируется, но не как PRIMARY KEY, потому что таблица MERGE не может обеспечить уникальность для набора базовых таблиц. (Аналогично, столбец с индексом UNIQUE в базах данных должен быть индексирован в таблице MERGE, но не как индекс UNIQUE).
После создания таблицы MERGE вы можете использовать её для выдачи запросов, которые работают со всей группой таблиц как с единым целым:
mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table |
| 3 | t1 |
| 1 | Testing |
| 2 | table |
| 3 | t2 |
+---+---------+
Чтобы перенастроить таблицу MERGE на другой набор таблиц MyISAM, вы можете использовать один из следующих методов:
Удалите таблицу
MERGEи пересоздайте её.-
Используйте
ALTER TABLE, чтобы изменить список базовых таблиц.tbl_nameUNION=(...)Также можно использовать
ALTER TABLE ... UNION=()(то есть с пустымUNIONклаузом), чтобы удалить все базовые таблицы. Однако в этом случае таблица фактически пустая, и вставки терпят неудачу, так как нет базовой таблицы для новых строк. Такая таблица может быть полезна в качестве шаблона для создания новыхMERGEтаблиц с помощьюCREATE TABLE ... LIKE.
Определения и индексы базовых таблиц должны строго соответствовать определению таблицы MERGE. Соответствие проверяется при открытии таблицы, входящей в состав таблицы MERGE, а не при создании самой таблицы MERGE. Если какая-либо таблица не проходит проверки соответствия, операция, которая вызвала открытие таблицы, завершается неудачей. Это означает, что изменения в определениях таблиц внутри таблицы MERGE могут привести к ошибке при доступе к таблице MERGE. Применяемые к каждой таблице проверки соответствия:
Базовая таблица и таблица
MERGEдолжны иметь одинаковое количество столбцов.Порядок столбцов в базовой таблице и таблице
MERGEдолжны совпадать.-
Кроме того, спецификации каждого соответствующего столбца в родительской таблице
MERGEи базовых таблицах сравниваются и должны удовлетворять этим проверкам:Тип столбца в базовой таблице и таблице
MERGEдолжен совпадать.Длина столбца в базовой таблице и таблице
MERGEдолжна совпадать.Столбец в базовой таблице и столбец в таблице
MERGEмогут бытьNULL.
-
Базовая таблица должна иметь не меньше индексов, чем таблица
MERGE. Базовая таблица может иметь больше индексов, чем таблицаMERGE, но не меньше.ПримечаниеСуществует известная проблема, когда индексы по тем же столбцам должны быть в одинаковом порядке как в таблице
MERGE, так и в базовых таблицахMyISAM. См. Баг #33653.Каждый индекс должен удовлетворять этим проверкам:
Тип индекса в базовой таблице и в таблице
MERGEдолжны совпадать.Количество частей индекса (то есть нескольких столбцов в составном индексе) в определении индекса для базовой таблицы и таблицы
MERGEдолжны совпадать.-
Для каждой части индекса:
Длины частей индекса должны совпадать.
Типы частей индекса должны совпадать.
Языки частей индекса должны совпадать.
Проверьте, могут ли части индекса быть
NULL.
Если таблица MERGE не может быть открыта или использована из-за проблемы с базовой таблицей, CHECK
TABLE отображает информацию о таблице, которая вызвала проблему.
Дополнительные ресурсы
Форум, посвящённый двигателю
MERGEхранения, доступен по адресу https://forums.mysql.com/list.php?93.
© 2025 Oracle
Licensed under the GPLv2 License.