允许对存储在远程MySQL服务器上的数据执行SELECT
和INSERT
查询。
语法
mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']);
参数
host:port
— MySQL服务器地址.database
— 远程数据库名称.table
— 远程表名称.user
— MySQL用户.password
— 用户密码.replace_query
— 将INSERT INTO
查询转换为REPLACE INTO
的标志。
0
- 查询被执行为 INSERT INTO
。1
- 查询被执行为 REPLACE INTO
。on_duplicate_clause
— 添加 ON DUPLICATE KEY on_duplicate_clause
表达式到 INSERT
查询。使用此项时,需要设置 replace_query = 0
。如果你同时设置replace_query = 1
和on_duplicate_clause
,ClickHouse / ByteHouse将产生异常。简单的 WHERE
子句如 =, !=, >, >=, <, <=
将即时在MySQL服务器上执行。其余的条件和 LIMIT
只有在对MySQL的查询完成后,才会在ClickHouse / ByteHouse中执行采样约束。
支持使用|
并列进行多副本查询,示例如下:
SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password');
或
SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password');
返回值
与原始MySQL表具有相同列的表对象。
说明
在INSERT
查询中为了区分mysql(...)
与带有列名列表的表名的表函数,你必须使用关键字FUNCTION
或TABLE FUNCTION
。查看如下示例。
MySQL中的表:
mysql> CREATE TABLE `test`.`test` ( -> `int_id` INT NOT NULL AUTO_INCREMENT, -> `float` FLOAT NOT NULL, -> PRIMARY KEY (`int_id`)); mysql> INSERT INTO test (`int_id`, `float`) VALUES (1,2); mysql> SELECT * FROM test; +--------+-------+ | int_id | float | +--------+-------+ | 1 | 2 | +--------+-------+
从ClickHouse中查询数据:
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123')
┌─int_id─┬─float─┐ │ 1 │ 2 │ └────────┴───────┘
替换和插入:
INSERT INTO FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 1) (int_id, float) VALUES (1, 3); INSERT INTO TABLE FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 0, 'UPDATE int_id = int_id + 1') (int_id, float) VALUES (1, 4); SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');
┌─int_id─┬─float─┐ │ 1 │ 3 │ │ 2 │ 4 │ └────────┴───────┘