CONNECT — Использование типов таблиц TBL и MYSQL вместе
Используя эти типы вместе, вы устраняете все ограничения движков FEDERATED и MERGE.
MERGE: Его ограничение очевидно: объединенные таблицы должны быть идентичными таблицами MyISAM, а MyISAM даже не является движком по умолчанию для MariaDB. Однако TBL обращается к набору таблиц CONNECT, но поскольку эти таблицы могут быть указаны пользователем или внутренне созданными таблицами MYSQL, нет ограничений на тип таблиц, которые могут быть объединены.
TBL также намного гибче. Объединённые таблицы не должны быть «идентичными», они должны просто иметь столбцы, определённые в таблице TBL. Если тип одного столбца в объединённой таблице не соответствует типу соответствующего столбца в таблице TBL, значение столбца будет преобразовано. Как мы видели, если один столбец таблицы TBL не существует в одной из объединённых таблиц, соответствующее значение будет установлено в null. Если столбцы в подтаблице имеют другое имя, к ним можно получить доступ по положению, используя параметр столбца FLAG CONNECT.
Однако одним ограничением типа TBL относительно MERGE является то, что таблицы TBL в настоящее время являются только для чтения; INSERT не поддерживается TBL. Также продолжайте использовать MERGE для доступа к списку идентичных таблиц MyISAM, так как это будет быстрее, а не через API MySQL.
FEDERATED(X): Основным ограничением FEDERATED является доступ только к таблицам MySQL/MariaDB. Тип таблицы MYSQL в CONNECT имеет то же ограничение, но CONNECT предоставляет тип таблицы ODBC и тип таблицы JDBC, которые могут обращаться к таблицам любой СУБД, предоставляющей драйвер ODBC или JDBC (включая MySQL, хотя это не очень полезно!).
Ещё одно значительное ограничение FEDERATED — это доступ только к одной таблице. Объединив таблицы TBL и MYSQL, CONNECT позволяет получить доступ к набору локальных или удалённых таблиц как к одной таблице. Конечно, подтаблицы могут находиться на разных серверах. С помощью одного оператора SELECT менеджер компании сможет получить результаты со всех компьютеров своих филиалов. Это полезно для дистрибуции, банковского дела и многих других отраслей.
Удаленное выполнение сложных запросов
Многие компании или административные структуры должны иметь дело с распределённой информацией. CONNECT позволяет эффективно с ней работать, не копируя её в централизованную базу данных. Предположим, на некоторых удалённых машинах сети m1, m2, … mn есть информация, содержащаяся в двух таблицах t1 и t2.
Предположим, мы хотим выполнить запрос на всех серверах, например:
select c1, sum(c2) from t1 a, t2 b where a.id = b.id group by c1;
Это вызывает множество проблем. Возврат значений столбцов таблиц t1 и t2 со всех серверов может быть большим сетевым трафиком. Группировка по возможным огромным результирующим таблицам может быть длительным процессом. Кроме того, объединение таблиц t1 и t2 может быть релевантно только в том случае, если связанные кортежи принадлежат одной машине, что требует добавления условия на дополнительный столбец tabid или servid.
Всё это можно избежать и оптимизировать, заставив запрос выполняться локально на каждом сервере и извлекая только небольшие результаты запросов группировки. Вот как это сделать. Для каждой удалённой машины создайте таблицу, которая будет извлекать локально выполненный запрос. Например, для m1:
create table rt1 engine=connect option_list='host=m1' srcdef='select c1, sum(c2) as sc2 from t1 a, t2 b where a.id = b.id group by c1';
Обратите внимание на псевдоним для функционального столбца. Псевдоним потребовался бы для столбца c1, если бы его имя было другим на некоторых машинах. Имена таблиц t1 и t2 также могут быть разными на удалённых машинах. Истинные имена должны использоваться в параметре SRCDEF. Это создаст набор таблиц с двумя столбцами под названием c1 и sc2[1].
Затем создайте таблицу, которая будет извлекать результат всех этих таблиц:
create table rtall engine=connect table_type=tbl table_list='rt1,rt2,…,rtn' option_list='thread=yes';
Теперь вы можете получить нужный результат:
select c1, sum(sc2) from rtall;
Практически вся работа будет выполнена на удалённых машинах одновременно благодаря параметру потока, что делает этот запрос сверхбыстрым даже для больших таблиц на многих удалённых машинах.
Поток в настоящее время находится в стадии тестирования. Используйте его только для тестирования и сообщите о любых неполадках на JIRA.
Предоставление списка серверов
Интересный случай, когда запрос, который нужно выполнить на удалённых машинах, одинаков для всех. Тогда можно избежать объявления всех подтаблиц. В этом случае используется параметр списка таблиц для указания списка серверов, на которые нужно отправить запрос SRCDEF. Это будет список URL-адресов и/или имён серверов Federated.
Например, предположим, что для всех удалённых серверов были созданы серверы federated srv1, srv2, … srvn, тогда можно создать таблицу TBL, позволяющую получить результат запроса, выполненного на всех из них, с помощью:
create table qall [column definition] engine=connect table_type=TBL srcdef='a query' table_list='srv1,srv2,…,srvn' [option_list='thread=yes'];
Например:
create table verall engine=connect table_type=TBL srcdef='select @@version' table_list=',server_one'; select * from verall;
Этот ответ:
| @@version |
|---|
| 10.0.3-MariaDB-debug |
| 10.0.2-MariaDB |
Здесь список серверов указывает пустой сервер, соответствующий локальному MariaDB, и сервер federated под названием server_one.
- ↑ Чтобы сгенерировать столбцы из запроса
SRCDEF, CONNECT должен его выполнить. Это гарантирует, что он корректен. Однако, если удалённый сервер ещё не подключён, или удалённая таблица ещё не существует, вы можете в качестве альтернативы указать столбцы в операторе создания таблицы.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-using-the-tbl-and-mysql-table-types-together/