15.7 Слиянный движок хранения
Движок хранения MERGE, также известный как движок MRG_MyISAM, представляет собой набор идентичных MyISAM таблиц, которые могут использоваться как одна. “Идентичные” означает, что все таблицы имеют одинаковые типы данных столбцов и информацию об индексах. Нельзя слить MyISAM таблицы, в которых столбцы перечислены в разном порядке, не имеют точно таких же типов данных в соответствующих столбцах или имеют индексы в разном порядке. Однако, любая или все MyISAM таблицы могут быть сжаты с помощью myisampack. См. Раздел 4.6.5, «myisampack — Генерация сжатых, только для чтения таблиц MyISAM». Различия между такими таблицами не имеют значения:
Имена соответствующих столбцов и индексов могут отличаться.
Комментарии к таблицам, столбцам и индексам могут отличаться.
Опции таблицы, такие как
AVG_ROW_LENGTH,MAX_ROWSилиPACK_KEYS, могут отличаться.
Альтернативой таблице MERGE является разнесённая таблица, которая хранит разделы одной таблицы в отдельных файлах. Разбиение позволяет выполнять некоторые операции более эффективно и не ограничено движком хранения MyISAM. Дополнительную информацию см. в Главе 22, Разбиение.
При создании таблицы MERGE MySQL создаёт два файла на диске. Файлы имеют имена, начинающиеся с имени таблицы и расширение, указывающее тип файла. В файле .frm хранится формат таблицы, а файл .MRG содержит имена базовых MyISAM таблиц, которые должны использоваться как одна. Таблицы не обязательно должны находиться в той же базе данных, что и таблица 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.