对于RediSearch,创建单个索引还是多个索引更好?

时间:2019-01-31 07:07:11

标签: performance search redis redisearch

Am在具有以下条件的多租户应用程序中使用RediSearch构建索引:

  • 150,000个租户
  • 每个租户平均拥有3500个客户
  • 每个客户都有10个字段,这些字段将添加到索引中
  • 所有字段均为TextFields

问题是,在这种情况下,最佳实践(性能,内存/存储,灵活性)是什么?

我应该创建一个带有customer_index字段的tenant_code来帮助识别哪些数据属于哪个租户,还是应该创建一个租户特定索引?

根据我目前的经验和理解,特定于租户的索引将意味着很多索引,但其中包含的数据较少,这还使我能够灵活地为特定租户删除和重新创建索引吗?

在Python中,代码如下:

单个客户索引

client = Client(`customer_index`)
client.create_index(
            [
                TextField('tenant_code'), TextField('last_name'), TextField('first_name'),
                TextField('other_name'), 
            ]
        )   

租户特定客户索引

client = Client(`tenant_code_customer_index`)
client.create_index(
            [
                TextField('last_name'), TextField('first_name'), TextField('other_name'), 
            ]
        )

1 个答案:

答案 0 :(得分:2)

由于每个租户只有3500个客户(相对较少),因此最好使用更大的索引来节省内存。由于记录太少,每个索引的资源开销可能会超过索引本身的大小。由于还会为每个索引的每个索引项创建一个新的Redis密钥,因此这也会增加redis本身的密钥数量。因此,如果每个数据库中有〜2000个唯一术语,则最终将获得300M Redis密钥(2k * 150k)。相比之下,使用单个索引将只剩下2k个键。

在性能方面,也应该没有任何区别,因为租户代码本身就是一个倒排索引,因此搜索不太可能需要筛选更大索引中的更多记录。

要删除,您只需收集符合条件的ID列表即可,例如“ FT.SEARCH idx @tenant:yourcode”并分别对每个记录调用FT.DEL。我假设这不是每五秒钟执行一次的操作,所以您应该在那儿呆住。

请注意,现在甚至不可能使用15万个索引,因为会为每个索引创建一个专用的索引线程(尽管将来的发行版中将提供对单个线程执行索引的选项)。