参考文档
https://clickhouse.tech/docs/en/engines/table-engines/integrations/mysql/
前言
mysql引擎并不在ck的节点上存储数据,数据依然存在于远程的mysql服务中。ck只是建立了一个和mysql的库表映射关系,不仅仅可以映射整个库(不建议这样做),也可以映射某些表。所以mysql的数据变更和ck表中的映射表是实时同步的。ck会将在ck执行的sql语法翻译成mysql的语法,最终发送给远程的mysql服务执行,需要注意的是 类似于=, !=, >, >=, <, <=注意的条件语句会在mysql服务执行,而类似于limit这样的语句会在mysql返回数据后再在ck服务执行,所以mysql引擎适合mysql小表的操作。且注意sql优化,减少对mysql的查询压力。
虽然mysql引擎支持insert语句,但是不建议使用,生产环境建议使用mysql只读账号,做表映射连接使用。
创建规则
MySQL(
'host:port',
'database',
'table',
'user',
'password',
[ replace_query, 'on_duplicate_clause']
);
host:port mysql服务器地址
database 数据库
table 表名
user 数据库用户 建议使用只读用户。
password 数据库密码
下面两个参数一般不建议操作
1,replace_query 默认为0 表示 insert into ,如果设置为1 表示 replace into
2,on_duplicate_clause 如果不为空 replace_query必须为0,对应 on duplicate key 后的语句 例如 填写 update c1 = c1+1
创建库DEMO(不推荐)
create database IF NOT EXISTS mysql_testDB engine=MySQL('xxxx:3306', 'xxxx', 'xxxx', 'xxxx'))
mysql库引擎会映射整个库的数据表,会有很大的数据风险,同时执行频繁的数据查询会对mysql远程服务产生很大的压力。如果需要库引擎,建议使用MaterializeMySQL。
创建表DEMO
create table IF NOT EXISTS demo_db.mysql_livetranscode_domain ON CLUSTER demo0201oddp_v1
(
domain_id Int32,
domain String,
client_id Int32,
product_id Int32,
float_up_ratio Int32,
billing_status Int8,
CURRENT_TIME DateTime
)
engine = MySQL('xxxx:3306', 'xxxx', 'xxxx', 'xxxx', 'xxxx');
mysql表引擎,数据库用户强烈建议使用只读账号。同时只做小表的映射,执行sql注意优化。需要注意字段映射,否则会出现DB::Exception: mysqlxx::BadQuery: Unknown column 'name' in 'field list'字段对不上的异常。 mysql表引擎和mysql函数功能类似,推荐使用表引擎。