SELECT и INSERT к данным, хранящимся на удаленном сервере MySQL.
Синтаксис
Аргументы
Аргументы также можно передавать с помощью именованных коллекций. В этом случае
host и port нужно указывать отдельно. Такой подход рекомендуется для продакшн-среды.
Простые секции WHERE, такие как =, !=, >, >=, <, <=, в настоящее время выполняются на сервере MySQL.
Остальные условия и ограничение выборки LIMIT выполняются в ClickHouse только после завершения запроса к MySQL.
TLS/SSL
Учётные данные для зашифрованного подключения к MySQL передаются как ключи именованной коллекции (или как аргументы типа ключ-значение):
Значениями служит содержимое соответствующих PEM-файлов, которое можно скопировать в именованную коллекцию или запрос. Они маскируются в журналах и в запросах
SHOW так же, как пароли.
Эти же учётные данные можно также указать как пути к файлам на сервере в ssl_ca, ssl_cert и ssl_key — но только в именованной коллекции, определённой в файле конфигурации сервера; такое значение нельзя переопределить в запросе. Сервер открывает эти файлы со своими привилегиями, поэтому приём пути из SQL позволил бы любому пользователю, способному определить источник MySQL, исследовать локальную файловую систему и проходить аутентификацию с сертификатом и ключом, к которым у него нет доступа на чтение.
Передача запроса вместо имени таблицы
Вместо имени таблицы в качестве третьего аргумента можно указать запросSELECT, который передаётся в MySQL как есть. Структура результирующей таблицы определяется по результату запроса. Запрос можно записать либо как подзапрос, либо обернуть в функцию query:
INSERT в неё не поддерживается. Тот же синтаксис поддерживает движок таблицы MySQL.
Форма подзапроса
(SELECT ...) разбирается ClickHouse и перед отправкой на сервер повторно сериализуется в диалекте MySQL (с экранированием идентификаторов обратными кавычками). Поэтому она должна быть корректным ClickHouse SQL. Чтобы передать синтаксис, специфичный для MySQL, который ClickHouse не разбирает, используйте форму query('...'), текст которой отправляется в MySQL без изменений.Любой внешний WHERE, LIMIT, агрегация и т. д. из окружающего запроса к ClickHouse не проталкиваются в переданный запрос — они применяются в ClickHouse после получения полного результата запроса. Чтобы ограничить объём данных, считываемых из MySQL, поместите фильтр внутрь передаваемого запроса. При external_table_strict_query = 1 внешний фильтр по столбцам табличной функции вызывает исключение вместо локального применения, поскольку его нельзя протолкнуть в переданный запрос. Проверка охватывает предикат WHERE верхнего уровня и каждую конъюнкцию AND верхнего уровня. PREWHERE по столбцам этой таблицы не относится к данной настройке: этот движок таблицы не поддерживает PREWHERE, и такой запрос отклоняется с ILLEGAL_PREWHERE независимо от настройки. Проверка выполняется только там, где фильтр вообще может быть протолкнут: когда эта таблица — единственная таблица запроса, на любой стороне INNER JOIN или на сохраняющей стороне внешнего JOIN (левой стороне LEFT JOIN, правой стороне RIGHT JOIN). На несохраняющей стороне LEFT/RIGHT JOIN и на любой стороне FULL JOIN ничего не проталкивается и не проверяется, поэтому фильтр по столбцам этой таблицы применяется локально после JOIN даже в строгом режиме. Там, где выполняется проверка, предикат, ссылающийся на другие таблицы, присоединённые в окружающем запросе, не проталкивается и исключается из проверки, независимо от того, ссылается ли он только на присоединённую сторону или объединяет её с этой таблицей в одном выражении, не содержащем AND (например, OR); такой предикат сохраняет обычную точку вычисления в ClickHouse (WHERE после JOIN, PREWHERE перед ним) и не отклоняется.|. Например:
Возвращаемое значение
Объект таблицы с теми же столбцами, что и исходная таблица MySQL.Некоторые типы данных MySQL могут сопоставляться с разными типами ClickHouse — это регулируется настройкой уровня запроса mysql_datatypes_support_level
В запросе
INSERT, чтобы отличить табличную функцию mysql(...) от имени таблицы со списком имён столбцов, необходимо использовать ключевые слова FUNCTION или TABLE FUNCTION. См. примеры ниже.Примеры
Таблица в MySQL:enable_compression
Включает сжатие для подключения по протоколу MySQL.
Значение по умолчанию: false.
Этот параметр применяется к:
- табличной функции
mysql; - движку таблицы
MySQL; - движку базы данных
MySQL; - именованным коллекциям, используемым в интеграциях MySQL.