--1.remote, remoteSecure
允許您訪問遠程服務器,而無需創建 Distributed 表。remoteSecure - 與 remote 相同,但是會使用加密鏈接。

這兩個函數都可以在 SELECT 和 INSERT 查詢中使用。

語法:

remote('addresses_expr', db, table[, 'user'[, 'password'], sharding_key])
remote('addresses_expr', db.table[, 'user'[, 'password'], sharding_key])
remoteSecure('addresses_expr', db, table[, 'user'[, 'password'], sharding_key])
remoteSecure('addresses_expr', db.table[, 'user'[, 'password'], sharding_key])
參數

addresses_expr – 代表遠程服務器地址的一個表達式。可以只是單個服務器地址。 服務器地址可以是 host:port 或 host。

host 可以指定為服務器名稱,或是IPV4或IPV6地址。IPv6地址在方括號中指定。

port 是遠程服務器上的TCP端口。 如果省略端口,則 remote 使用服務器配置文件中的 tcp_port (默認情況為,9000),remoteSecure 使用 tcp_port_secure (默認情況為,9440)。

IPv6地址需要指定端口。

類型: String。

db — 數據庫名。類型: String。
table — 表名。類型: String。
user — 用户名。如果未指定用户,則使用 default 。類型: String。
password — 用户密碼。如果未指定密碼,則使用空密碼。類型: String。
sharding_key — 分片鍵以支持在節點之間分佈數據。 例如: insert into remote('127.0.0.1:9000,127.0.0.2', db, table, 'default', rand())。 類型: UInt32。
返回值

來自遠程服務器的數據集。

用法

使用 remote 表函數沒有創建一個 Distributed 表更優,因為在這種情況下,將為每個請求重新建立服務器連接。此外,如果設置了主機名,則會解析這些名稱,並且在使用各種副本時不會計入錯誤。 在處理大量查詢時,始終優先創建 Distributed 表,不要使用 remote 表函數。

該 remote 表函數可以在以下情況下是有用的:

訪問特定服務器進行數據比較、調試和測試。
在多個ClickHouse集羣之間的用户研究目的的查詢。
手動發出的不頻繁分佈式請求。
每次重新定義服務器集的分佈式請求。
地址

example01-01-1
example01-01-1:9000
localhost
127.0.0.1
[::]:9000
[2a02:6b8:0:1111::11]:9000
多個地址可以用逗號分隔。在這種情況下,ClickHouse將使用分佈式處理,因此它將將查詢發送到所有指定的地址(如具有不同數據的分片)。

example01-01-1,example01-02-1
表達式的一部分可以用大括號指定。 前面的示例可以寫成如下:

example01-0{1,2}-1
大括號可以包含由兩個點(非負整數)分隔的數字範圍。 在這種情況下,範圍將擴展為生成分片地址的一組值。 如果第一個數字以零開頭,則使用相同的零對齊形成值。 前面的示例可以寫成如下:

example01-{01..02}-1
如果您有多對大括號,它會生成相應集合的直接乘積。

大括號中的地址和部分地址可以用管道符號(|)分隔。 在這種情況下,相應的地址集被解釋為副本,並且查詢將被髮送到第一個正常副本。 但是,副本將按照當前load_balancing設置的順序進行迭代。此示例指定兩個分片,每個分片都有兩個副本:

example01-{01..02}-{1|2}
生成的地址數由常量限制。目前這是1000個地址。

示例

-從遠程服務器選擇數據:

SELECT * FROM remote('127.0.0.1', db.remote_engine_table) LIMIT 3;
--將遠程服務器中的數據插入表中:

CREATE TABLE remote_table (name String, value UInt32) ENGINE=Memory;
INSERT INTO FUNCTION remote('127.0.0.1', currentDatabase(), 'remote_table') VALUES ('test', 42);
SELECT * FROM remote_table;

 

--2.mysql
允許對存儲在遠程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的標誌。如果replace_query=1`,查詢被替換。

on_duplicate_clause — 添加 ON DUPLICATE KEY on_duplicate_clause 表達式到 INSERT 查詢。明確規定只能使用 replace_query = 0 ,如果你同時設置replace_query = 1和on_duplicate_clause`,ClickHouse將產生異常。

示例:INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1

on_duplicate_clause這裏是UPDATE c2 = c2 + 1。請查閲MySQL文檔,來找到可以和ON DUPLICATE KEY一起使用的 on_duplicate_clause子句。

簡單的 WHERE 子句如 =, !=, >, >=, <, <= 將即時在MySQL服務器上執行。其餘的條件和 LIMIT 只有在對MySQL的查詢完成後,才會在ClickHouse中執行採樣約束。

支持使用|並列進行多副本查詢,示例如下:

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,
-> `int_nullable` INT NULL DEFAULT NULL,
-> `float` FLOAT NOT NULL,
-> `float_nullable` FLOAT NULL DEFAULT NULL,
-> PRIMARY KEY (`int_id`));
Query OK, 0 rows affected (0,09 sec)

mysql> insert into test (`int_id`, `float`) VALUES (1,2);
Query OK, 1 row affected (0,00 sec)

mysql> select * from test;
+------+----------+-----+----------+
| int_id | int_nullable | float | float_nullable |
+------+----------+-----+----------+
| 1 | NULL | 2 | NULL |
+------+----------+-----+----------+
1 row in set (0,00 sec)
--從ClickHouse中查詢數據:

SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123')
┌─int_id─┬─int_nullable─┬─float─┬─float_nullable─┐
│ 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 │
└────────┴───────┘