一个会员标签的存储和检索需求
发布于 8 天前 作者 catchex 89 次浏览 来自 问答

我有一个场景,会员+会员标签(超过2000个)存储在一张表。 我的想法: 通过创建两千个字段不行,由于ClickHouse 里没有Binary 类型,只能通过Array 存储。 但Array 的查询效率太低了,通过arrayElement(tag, 1) = a_tag AND arrayElement(tag, 1) = a_tag 这样的查询效率太低,在几千万的表里超过10秒才出结果。

2 回复

如果设法转成位操作,应该会快很多。

为每个会员创建 2500/64个 Int64列,大概50列C1…C50左右。

插入记录时,所有tag列的默认值为0.

插入时根据用户的标签计算出哪些列需要设置。 比如该用户有第140个,160个标签,那么140 % 64 + 1,即第3列的第12位为1, 第32位为1。

查询时,根据查询标签构造查询条件,比如: where bitXor(c3, 0b1000000000000) = 1

多条件也照此办理。

而且 where bitXor(c3, 0b1000000000000) 这样的查询效率不够高,无法用到索引。数据量大了,依然很慢

回到顶部