问题描述
我在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.