抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

我们的数据计算式基于clickhouse的,由于接触clickhouse不久,看官网介绍语法和mysql是类似的,就放心大胆的使用mysql的大量语法,然后遇到了一个很奇怪的问题,也是这个奇怪的问题让我对列式数据库有了更深入的了解。

遇到的问题

先了解一下clickhouse对列式数据库的图表述:
列式数据库

再了解一下mysql的行式数据库的图表述:
行式数据库

然后下面这样一段sql:

1
2
3
4
5
6
select a,0 as b,0 as c
from tbl_xxx
where del = 1
and (1>1 or b in (1,2,3) or c in (4,5,6))
group by a,b,c
order by a desc

这样一段很简单的sql,在clickhouse中却无论如何都查询不出结果,明明在where条件在数据库中满足条件的数据量非常的多,却出现这样奇怪的现象。

排查问题

  • 排查到的问题1:以为是 1>1这个语句导致了数据库无法查询出数据,所以将1>1 改成了 2>1,然而能查询出数据了,但是查询出的是全量的数据,所以经过验证后发现该问题无解
  • 排查到的问题2:突然想到会不会是由于对clikhouse不熟悉导致了相关的问题出现,所以将同样的表在mysql中创建好,并导入一部分数据,这时……,令人惊奇的事情发生了,mysql可以查出对应的数据

其实通过两个方法就定位到了问题所在,还是比较幸运的,接下来就是解决方案了。

解决问题

在经过现象验证后,发现行式数据库是这样的规则,当你查询的数据被你赋值了,其实where中的语句如果有相同的字段,那么直接就是对你赋值的值的查询了,所以 1,2,3怎么可以匹配上0这个数呢。
既然发现了问题,解决问题也很简单,有个最简单的方案:

  • 将b/c的select中的列名和group/order by中的列名都进行修改,修改为b_tmp,c_tmp即可解决问题了,因为这条sql使用了好几个union all,所以是无法舍弃对应的字段的,否则会报错。

结语

遇到不熟悉的组件还是要多多查看文档,工欲善其事必先利其器,多看文档,了解一下不同的话也是不会出现这样很简单但是有时候也能让人摸不着头脑的问题了,吃一堑长一智,也让我对列式数据库有了更深的理解。

评论