Spec-Zone.ru › MySQL 9.2

18.8.3 Примечания и советы по хранилищу FEDERATED

При работе с хранилищем FEDERATED следует учитывать следующие моменты:

  • Таблицы FEDERATED могут быть реплицированы на другие реплики, но необходимо убедиться, что серверы-реплики могут использовать комбинацию пользователя/пароля, определённую в строке CONNECTION (или строке в таблице mysql.servers) для подключения к удалённому серверу.

Следующие пункты указывают на возможности и ограничения хранилища FEDERATED:

  • Удаленный сервер должен быть сервером MySQL.

  • Удаленная таблица, к которой указывает таблица FEDERATED, должна существовать, прежде чем вы попытаетесь получить доступ к таблице через таблицу FEDERATED.

  • Одна таблица FEDERATED может указывать на другую, но необходимо быть осторожным, чтобы не создать цикл.

  • Таблица FEDERATED не поддерживает индексы в обычном понимании; поскольку доступ к данным таблицы осуществляется удаленно, удаленная таблица фактически использует индексы. Это означает, что для запроса, который не может использовать индексы и, следовательно, требует полного сканирования таблицы, сервер извлекает все строки из удаленной таблицы и фильтрует их локально. Это происходит независимо от используемых с этим оператором SELECT WHERE или LIMIT; эти условия применяются локально к возвращенным строкам.

    Запросы, которые не используют индексы, могут привести к плохой производительности и перегрузке сети. Кроме того, поскольку возвращаемые строки должны храниться в памяти, такой запрос также может привести к подкачке на локальном сервере или даже зависанию.

  • При создании таблицы FEDERATED следует соблюдать осторожность, так как определение индекса из эквивалентной таблицы MyISAM или другой таблицы может быть не поддерживаемо. Например, создание таблицы FEDERATED терпит неудачу, если таблица использует префикс индекса для любого VARCHAR, TEXT или BLOB столбцов. Следующее определение с использованием MyISAM является допустимым:

    CREATE TABLE `T1`(
        `A` VARCHAR(100),
        UNIQUE KEY(`A`(30))
    ) ENGINE=MYISAM;
    

    Префикс ключа в этом примере несовместим с хранилищем FEDERATED, и эквивалентное утверждение завершается ошибкой:

    CREATE TABLE `T1`(
        `A` VARCHAR(100),
        UNIQUE KEY(`A`(30))
    ) ENGINE=FEDERATED
      CONNECTION='MYSQL://127.0.0.1:3306/TEST/T1';
    

    По возможности следует разделять определение столбца и индекса при создании таблиц как на удалённом, так и на локальном сервере, чтобы избежать этих проблем с индексами.

  • Внутренне реализация использует SELECT, INSERT, UPDATE и DELETE, но не HANDLER.

  • Хранилище FEDERATED поддерживает SELECT, INSERT, UPDATE, DELETE, TRUNCATE TABLE и индексы. Оно не поддерживает ALTER TABLE или какие-либо операторы языка определения данных, напрямую влияющие на структуру таблицы, за исключением DROP TABLE. Текущая реализация не использует подготовленные запросы.

  • FEDERATED принимает операторы INSERT ... ON DUPLICATE KEY UPDATE, но если возникает нарушение уникальности ключа, оператор завершается с ошибкой.

  • Транзакции не поддерживаются.

  • FEDERATED обрабатывает массовые вставки таким образом, что несколько строк отправляются в удалённую таблицу в пакетной форме, что повышает производительность. Кроме того, если удалённая таблица использует транзакции, это позволяет удалённому хранилищу корректно выполнить откат оператора при возникновении ошибки. Данная возможность имеет следующие ограничения:

    • Размер вставки не должен превышать максимальный размер пакета между серверами. Если вставка превышает этот размер, она разбивается на несколько пакетов, и может возникнуть проблема с откатом.

    • Обработка массовых вставок не выполняется для INSERT ... ON DUPLICATE KEY UPDATE.

  • Хранилище FEDERATED не может узнать, изменилась ли удалённая таблица. Причина в том, что эта таблица должна работать как файл данных, который никогда не будет изменяться ничем, кроме системы управления базами данных. Целостность данных в локальной таблице может быть нарушена, если произойдут изменения в удалённой базе данных.

  • При использовании строки CONNECTION, вы не можете использовать символ '@' в пароле. Это ограничение можно обойти, используя оператор CREATE SERVER для создания подключения к серверу.

  • Параметры insert_id и timestamp не передаются поставщику данных.

  • Любой оператор DROP TABLE, выданный для таблицы FEDERATED, удаляет только локальную таблицу, а не удалённую.

  • Пользовательское разбиение не поддерживается для таблиц FEDERATED.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/federated-usagenotes.html

Spec-Zone.ru

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