Spec-Zone.ru › MySQL 5.7

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

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

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

Ниже перечислены функции, которые хранилище FEDERATED поддерживает и не поддерживает:

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

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

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

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

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

  • Следует проявлять осторожность при создании таблицы 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 не работают с кэшем запросов.

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

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

Spec-Zone.ru

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