RediSearch,创建单个索引好还是多个索引好?
For RediSearch, is it better to create a single index or multiple indexes?
正在使用 RediSearch 在多租户应用程序中构建索引:
- 150,000 个租户
- 每个租户平均有 3,500 位客户
- 每个客户有 10 个字段将被添加到索引中
- 所有字段都是
TextFields
。
问题是,在这种情况下,最佳实践 (性能,Memory/Storage,灵活性) 是什么?
我应该创建一个带有 tenant_code
字段的 customer_index
来帮助识别哪些数据属于哪个租户,还是应该创建租户特定索引?
根据我目前的经验和理解,tenant-specific-index 意味着很多索引,但其中的数据较少,它还可以让我灵活地为特定租户删除和重新创建索引?
在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'),
]
)
因为每个租户只有 3500 个客户(相对较少),所以使用更大的索引在内存方面会更好。由于记录如此之少,每个索引的资源开销可能会超过索引本身的大小。这也会增加 redis 本身的键数,因为每个索引的每个索引项都会创建一个新的 Redis 键。因此,如果您在每个数据库中有大约 2000 个唯一术语,您最终将得到 300M Redis 键(2k * 150k)。相比之下,使用单个索引将只剩下 2k 个键。
在性能方面,也不应该有任何区别,因为租户代码本身就是一个倒排索引,因此搜索不太可能需要在更大的索引中筛选更多记录。
要删除,您只需收集符合条件的 ID 列表,例如“FT.SEARCH idx @tenant:yourcode
”并分别对每条记录调用 FT.DEL
。我假设这不是每五秒执行一次的操作,所以你应该知道了。
请注意,现在甚至可能无法使用 150k 索引,因为为每个索引创建了一个专用索引线程(尽管在未来版本中将提供在单个线程上执行索引的选项)。
正在使用 RediSearch 在多租户应用程序中构建索引:
- 150,000 个租户
- 每个租户平均有 3,500 位客户
- 每个客户有 10 个字段将被添加到索引中
- 所有字段都是
TextFields
。
问题是,在这种情况下,最佳实践 (性能,Memory/Storage,灵活性) 是什么?
我应该创建一个带有 tenant_code
字段的 customer_index
来帮助识别哪些数据属于哪个租户,还是应该创建租户特定索引?
根据我目前的经验和理解,tenant-specific-index 意味着很多索引,但其中的数据较少,它还可以让我灵活地为特定租户删除和重新创建索引?
在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'),
]
)
因为每个租户只有 3500 个客户(相对较少),所以使用更大的索引在内存方面会更好。由于记录如此之少,每个索引的资源开销可能会超过索引本身的大小。这也会增加 redis 本身的键数,因为每个索引的每个索引项都会创建一个新的 Redis 键。因此,如果您在每个数据库中有大约 2000 个唯一术语,您最终将得到 300M Redis 键(2k * 150k)。相比之下,使用单个索引将只剩下 2k 个键。
在性能方面,也不应该有任何区别,因为租户代码本身就是一个倒排索引,因此搜索不太可能需要在更大的索引中筛选更多记录。
要删除,您只需收集符合条件的 ID 列表,例如“FT.SEARCH idx @tenant:yourcode
”并分别对每条记录调用 FT.DEL
。我假设这不是每五秒执行一次的操作,所以你应该知道了。
请注意,现在甚至可能无法使用 150k 索引,因为为每个索引创建了一个专用索引线程(尽管在未来版本中将提供在单个线程上执行索引的选项)。