CONNECT - Типы внешних таблиц
Поскольку существует множество драйверов ODBC и JDBC, и только основные из них были хорошо протестированы, эти типы таблиц нельзя считать стабильными. Используйте их с осторожностью в производственных приложениях.
Эти типы могут быть использованы для доступа к таблицам текущего или другого сервера базы данных. В настоящее время предоставляются шесть типов:
ODBC: Используется для доступа к таблицам из системы управления базами данных, предоставляющей ODBC-соединитель. ODBC — стандарт Microsoft и в настоящее время доступен в Windows. В Linux он также может быть использован, если установлен конкретный эмулятор ODBC. В настоящее время поддерживается только unixODBC.
JDBC: Используется для доступа к таблицам из системы управления базами данных, предоставляющей JDBC-соединитель. JDBC — стандарт Oracle, реализованный в Java, и предназначен в основном для использования в приложениях Java. Использование его напрямую из приложений C или C++ кажется практически невозможным из-за ошибки Oracle, которая до сих пор не исправлена. Однако это можно достичь с помощью обертки Java-класса, используемой как интерфейс между C++ и JDBC. С другой стороны, JDBC доступен на всех платформах и операционных системах.
Mongo: Для доступа к коллекциям MongoDB как к таблицам через драйвер MongoDB C. Поскольку для этого требуется как MongoDB, так и драйвер C, этот тип таблиц в настоящее время недоступен в двоичных дистрибутивах, а только при компиляции MariaDB из исходного кода.
MySQL: Этот тип является предпочтительным способом доступа к таблицам на другом сервере MySQL или MariaDB. Он использует API MySQL для доступа к внешней таблице. Несмотря на то, что это можно получить с помощью плагина FEDERATED(X), этот конкретный тип используется внутри CONNECT, поскольку он также позволяет получать доступ к таблицам текущего сервера.
PROXY: Внутренне используется некоторыми типами таблиц для доступа к другим таблицам из одной таблицы.
Спецификация внешних таблиц
Четыре основных типа внешних таблиц — odbc, jdbc, mongo и mysql — задаются, предоставляя следующую информацию:
- Источник данных. Это задается в параметре соединения.
- Удаленная таблица или представление для доступа. Это можно указать в строке подключения или с использованием конкретных параметров CONNECT.
- Определения столбцов. Это также можно оставить CONNECT для поиска с помощью функции обнаружения MariaDB.
- Необязательный параметр Quoted. Может быть установлен в 1 для цитирования идентификаторов в запросе, отправленном на удаленный сервер. Это необходимо, если имена столбцов или таблиц могут содержать пробелы.
Работа происходит путем установления соединения с внешним источником данных и отправки ему SQL-запроса (или его эквивалента, используя функции API для MONGO), позволяя ему выполнить исходный запрос. Для повышения производительности необходимо, чтобы удаленный источник данных выполнял максимальную обработку. Это необходимо, в частности, для уменьшения количества данных, возвращаемых источником данных.
Вот почему для SELECT-запросов CONNECT использует функцию cond_push MariaDB для получения максимального фрагмента условия WHERE исходного запроса, который может быть добавлен к запросу, отправленному в источник данных. Это происходит автоматически и не требует никаких действий со стороны пользователя.
Однако можно сделать больше. В дополнение к доступу к удаленной таблице CONNECT предлагает возможность указать, что должен делать удаленный сервер. Это делается путем указания его как представления в параметре srcdef. Например:
CREATE TABLE custnum ENGINE=CONNECT TABLE_TYPE=XXX CONNECTION='connecton string' SRCDEF='select pays as country, count(*) as customers from custnum group by pays';
В результате операция группировки (group by) будет выполнена удаленным сервером, значительно уменьшая объем данных, отправленных обратно по соединению.
Это даже можно увеличить, добавив в часть srcdef часть «compatible» запроса, где условия, подобные этому, выполняются для табличных таблиц. Обратите внимание, что для MariaDB эта таблица имеет два столбца: country и customers. Предположим, что исходный запрос:
SELECT * FROM custnum WHERE (country = 'UK' OR country = 'USA') AND customers > 5;
Как можно добавить условие WHERE в отправляемый srcdef? Существует много проблем:
- Где включить дополнительную информацию.
- Что делать с использованием псевдонимов.
- Как определить, что будет условием WHERE или HAVING.
Первая проблема решается путем подготовки представления srcdef для приема условий. Вышеприведенный пример srcdef преобразуется в:
SRCDEF='select pays as country, count(*) as customers from custnum where %s group by pays having %s';
%s в srcdef — это заполнитель для возможных совместимых частей условия WHERE исходного запроса. Если запрос select не содержит условия WHERE или предоставляет неприемлемое условие WHERE, заполнитель будет заполнен фиктивными условиями (1=1).
Другие проблемы должны быть решены путем добавления в создаваемую таблицу списка столбцов, которые необходимо перевести, потому что они являются псевдонимами или/и псевдонимами агрегатных функций, которые должны стать условием HAVING. Например, в этом случае:
CREATE TABLE custnum ENGINE=CONNECT TABLE_TYPE=XXX CONNECTION='connecton string' SRCDEF='select pays as country, count(*) as customers from custnum where %s group by pays having %s' OPTION_LIST='Alias=customers=*count(*);country=pays';
Это задается параметром alias, который используется в списке параметров. Он состоит из списка элементов, разделенных точкой с запятой, содержащих:
- Имя локального столбца (псевдоним на удаленном сервере)
- Знак равенства.
- Возможный символ «*», указывающий, что этот столбец соответствует агрегатной функции.
- Имя удаленного столбца.
С этой информацией CONNECT сможет сформировать запрос, отправленный на удаленный источник данных:
select pays as country, count(*) as customers from custnum where (pays = 'UK' OR pays = 'USA') group by country having count(*) > 5
Примечание: некоторые источники данных, включая MySQL и MariaDB, допускают псевдонимы в условии HAVING. В этом случае параметр alias мог бы быть указан как:
OPTION_LIST='Alias=customers=*;country=pays';
Существует другой параметр, phpos, позволяющий указать, какие плацехолдеры присутствуют и в каком порядке. Он задаётся как «W», «WH», «H» или «HW». Он редко используется, поскольку по умолчанию CONNECT может установить его из содержимого srcdef. Единственные случаи, когда он необходим, — это когда srcdef содержит только заполнитель HAVING или когда заполнитель HAVING встречается до заполнителя WHERE, что может встречаться в запросах, содержащих соединения. CONNECT не может обрабатывать более одного заполнителя каждого типа.
SRCDEF недоступен для таблиц MONGO, но существуют другие способы достижения этого, описанные в главе по типу таблиц MONGO.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-external-table-types/