Spec-Zone.ru › MySQL 8.4

18.7 Слиянный движок хранения

  • 18.7.1 Преимущества и недостатки таблиц MERGE
  • 18.7.2 Проблемы таблиц 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_name UNION=(...) для изменения списка базовых таблиц.

    Также можно использовать 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/merge-storage-engine.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API