我有一个Postgres数据库和一个用户标签表,列有UserId和TagId。每个用户可以有多个标签,反之亦然。
有没有办法以可扩展的方式实现多个标签的搜索?示例查询:
由于这不容易索引和扩展,我考虑使用某种内存缓存,以便更快地进行查找。你知道这个问题的任何现成解决方案吗?
由于
答案 0 :(得分:1)
首先,在不了解太多细节的情况下,我假设有许多标签但不是很多,这使得TagIds列的基数很低。我的回答是基于这个假设。
通常,低基数列上的索引无助于扩展此列上的查询。有关详细信息,请参阅Why low cardinality indexes negatively impact performance。
其次,您给出的一组示例查询清楚地给出了一个印象,即其他查询(此集合)可以是分离形式(换句话说,WHERE条件包含OR布尔谓词),这暗示没有索引会挽救如果分离的数量很大,则表现如何。 DBMS将考虑(a)扫描整个表并使用WHERE条件测试每一行,以及(b)扫描列TagIds上的索引。
最后但同样重要的是,根据数据现在驻留在内存中的事实,进入内存将帮助您。但是,原则上,内存中的DBMS也考虑(a)和(b),并可能选择(a)而不是(b)。
我建议使用PostgreSQL中记录的function index。如果您不处理临时查询,请将其考虑在内: