18.7 Слиянный движок хранения
Движок хранения 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.