Spec-Zone.ru › MySQL 9.2

18.7 Двигатель MERGE-хранилища

  • 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-9.2-en/merge-storage-engine.html

Spec-Zone.ru

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