1

我在 Clickhouse 中有一个大表,其中有一列名为“Route”,它是一个逗号分隔的 id 字符串。它看起来像这样:123421,25245,346263. 一个字符串中可以有数百个 id。

查询该表以选择经过某些 id 的路线,其中订单很重要,如下所示:

SELECT * FROM MY_TABLE WHERE Route LIKE '%123421%346263%'

由于查询可能很慢,我尝试通过在 Route 列上添加数据跳过索引来加快查询速度。根据 Clickhouse 文档,tokenbf_v2 索引似乎是为我的目的而创建的,因为据我了解,它应该将我的 Route 列分解为标记,并且应该有助于加快 LIKE 查询。

但是,当我添加索引时:

alter table MY_TABLE add INDEX route_index (Route) TYPE tokenbf_v1(256, 5, 0) GRANULARITY 1;

,并确保它是通过运行创建的

OPTIMIZE TABLE MY_TABLE FINAL;

根本没有加速。

当我在 clickhouse 客户端中分析我的查询跟踪时,它始终显示:

Index `route_index` has dropped 0 granules.

显然我的bloomfilter tokenbf 索引没有效果。有人不知道为什么吗?

顺便说一句,我的 Route 列有类型String,表的粒度MY_TABLE是 128。

4

2 回答 2

1

为了保证将索引应用于所有数据,需要将它们全部重新插入。我建议使用所需的索引创建测试表并部分填充它。将其用作寻找更多最佳索引的游乐场。


考虑使用hasToken -function或其他允许tokenbf_v1 -index 的函数(请参阅跳过索引:函数支持):

SELECT *
FROM (
  SELECT * 
  FROM MY_TABLE 
  WHERE hasToken(Route, '123421') AND hasToken(Route, '346263'))
WHERE Route LIKE '%123421,346263%'
于 2020-10-10T17:41:40.477 回答
1

就像实际上可以工作

https://github.com/ClickHouse/ClickHouse/issues/15835#issuecomment-706711503

select Count(*) from MY_TABLE where Route like '%,3119550599,%'
Index `route_index` has dropped 781655 / 782032 granules.
于 2020-10-11T14:40:15.377 回答