遇到了一个这样的需求,报表上展示超时的订单信息
部门,统计日期,超时订单编号,订单计划开始/结束时间 订单实际开始/结束时间
这里需要让业务方当其认为这条记录不是真的超时时,为这条记录打上一个不纳入统计的标签,如果业务方选择了隐藏,那么这部分打上标签的数据就不会纳入统计,如果没有点隐藏按钮就不会受影响,打标签前怎么统计就怎么统计。
目前的解决方案是:前端在页面交互时通过业务方输入的内容将带标签信息写入mysql表,使用clickhouse直连mysql提供接口查询服务。
如果有更好的设计方案也欢迎交流😊
想着有这么个需求就测试下clickhouse是否能直连mysql,才有了下面的测试:
首先在mysql中创建一张表
create table test.employee(
id int,
name varchar(255),
age int,
gender varchar(10),
e_mail varchar(255)
);
mysql插入数据
insert into test.employee values
(1,'zhangsan',24,'mail','zhangsan@163.com.cn'),
(2,'lisi',15,'femail','lisi@163.com.cn'),
(3,'wangwu',18,'mail','wangwu@163.com.cn');
clickhouse建表
create table mysqlemployee(
id Nullable(Int32),
name Nullable(String),
age Nullable(Int32),
gender Nullable(String),
e_mail Nullable(String)
)engine=MySQL('192.168.xxx.xxx:3306','test','employee','username','password');
查询clickhouse表
select * from test.mysqlemployee;
====>
┌─id─┬─name─────┬─age─┬─gender─┬─e_mail──────────────┐
│ 1 │ zhangsan │ 24 │ mail │ zhangsan@163.com.cn │
│ 2 │ lisi │ 15 │ femail │ lisi@163.com.cn │
│ 3 │ wangwu │ 18 │ mail │ wangwu@163.com.cn │
└────┴──────────┴─────┴────────┴─────────────────────┘
对mysql表执行insert操作后查询clickhouse表
-- mysql执行insert操作
insert into test.employee values(4,'hanwu',33,'femail','hanwu@163.com');
-- 查询ck
select * from test.mysqlemployee;
====>
┌─id─┬─name─────┬─age─┬─gender─┬─e_mail──────────────┐
│ 1 │ zhangsan │ 24 │ mail │ zhangsan@163.com.cn │
│ 2 │ lisi │ 15 │ femail │ lisi@163.com.cn │
│ 3 │ wangwu │ 18 │ mail │ wangwu@163.com.cn │
│ 4 │ hanwu │ 33 │ femail │ hanwu@163.com │
└────┴──────────┴─────┴────────┴─────────────────────┘
对mysql执行update操作后查看clickhouse表
-- mysql update操作
update test.employee set age=50 where id=1;
-- 查询ck表
select * from test.mysqlemployee;
====>
┌─id─┬─name─────┬─age─┬─gender─┬─e_mail──────────────┐
│ 1 │ zhangsan │ 50 │ mail │ zhangsan@163.com.cn │
│ 2 │ lisi │ 15 │ femail │ lisi@163.com.cn │
│ 3 │ wangwu │ 18 │ mail │ wangwu@163.com.cn │
│ 4 │ hanwu │ 33 │ femail │ hanwu@163.com │
└────┴──────────┴─────┴────────┴─────────────────────┘
对mysql执行delete操作
-- mysql delete 操作
delete from test.employee where id=2;
-- 查看ck
select * from test.mysqlemployee;
====>
┌─id─┬─name─────┬─age─┬─gender─┬─e_mail──────────────┐
│ 1 │ zhangsan │ 50 │ mail │ zhangsan@163.com.cn │
│ 3 │ wangwu │ 18 │ mail │ wangwu@163.com.cn │
│ 4 │ hanwu │ 33 │ femail │ hanwu@163.com │
└────┴──────────┴─────┴────────┴─────────────────────┘
对mysql执行drop操作
-- mysql drop 操作
drop table test.employee;
-- 查询ck表,mysql表删除后会抛出异常
select * from test.mysqlemployee;
====>
Code: 1000. DB::Exception: Received from localhost:9000. DB::Exception: mysqlxx::BadQuery: Table 'test.employee' doesn't exist (192.168.xxx.xxx:3306)
对clickhouse执行insert操作
-- clickhouse执行insert操作
insert into test.mysqlemployee values(5,'tmp',23,'mail','tmp@100.com');
-- 查询ck
select * from test.mysqlemployee;
====>
┌─id─┬─name─┬─age─┬─gender─┬─e_mail──────┐
│ 5 │ tmp │ 23 │ mail │ tmp@100.com │
└────┴──────┴─────┴────────┴─────────────┘
--查询mysql
select * from test.employee;
====>
+------+------+------+--------+-------------+
| id | name | age | gender | e_mail |
+------+------+------+--------+-------------+
| 5 | tmp | 23 | mail | tmp@100.com |
+------+------+------+--------+-------------+