Spec-Zone.ru › MySQL 5.7

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

  • 15.7.1 Преимущества и недостатки слиянных таблиц
  • 15.7.2 Проблемы слиянных таблиц

Движок хранения 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_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-5.7-en/merge-storage-engine.html

Spec-Zone.ru

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