为什么将tokenbf_v2索引添加到我的Clickhouse表没有任何作用

问题描述

我在Clickhouse中有一张大桌子,上面有一列叫做“ Route”,这是一个用逗号分隔的id字符串。看起来例如像这样:123421,25245,346263一个字符串中可以有数百个ID。

查询该表以选择经过特定ID的,顺序重要的Route,例如:

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。

解决方法

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


考虑使用 hasToken 功能或其他允许使用 tokenbf_v1 -index的功能(请参见Skipping index: functions support):

SELECT *
FROM (
  SELECT * 
  FROM MY_TABLE 
  WHERE hasToken(Route,'123421') AND hasToken(Route,'346263'))
WHERE Route LIKE '%123421,346263%'
,

喜欢实际上可以工作

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.