我有一个这样的表:
CREATE TABLE peoples(
user_id int,
people_id text,
email text,
PRIMARY KEY ((user_id), people_id)
);
当我需要导入新人来检查一大群人而不是分别检查每一行时,这是一种好习惯吗?
像这样:
SELECT * FROM peoples WHERE user_id = 1 and people_id IN ('7651-ABCD', '9874-UHAG');
我会从服务器端检查它是否存在,而是像这样查询每个人:
SELECT * FROM peoples WHERE user_id = 1 and people_id = '7651-ABCD';
我需要导入大约 30-50 千人,并且必须知道用户是否存在这些人,我必须先读后写。
IN有限制吗? IN 的良好做法是多少?
我使用的是二进制协议(protocol),所以我更喜欢每次使用 IN 进行选择请求。
谢谢!
最佳答案
要直接回答您的问题,那么通常执行许多小查询而不是大查询(例如,具有大量 ID 的 IN)是首选,因为它可以更均匀地分散集群中的负载。但是根据您的集群大小等,我只是将其配置为可配置并进行测试。
然而,您可能想要反规范化以适应此查询。例如,您还可以有一个由 people id 键控的表,为您提供与他们关联的用户,因此对于您要导入的每个人,您可以直接看到哪些用户受到影响。基于查询的建模是正常的方式。
关于Cassandra where IN 子句限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28049641/