Cassandra IN Clause在一个分区中

时间:2017-05-18 22:39:10

标签: cassandra

我用谷歌搜索并发现在Cassandra中有一个IN条款因性能考虑而被认为是不可取的。

如果我有一张像

这样的表格
create table Genre (
   genre_id bigint,
   movie_id bigint,
   primary key (genre_id, movie_id)
);

并编写类似

的查询
select * from Genre where genre_id = 1 and movie_id IN (1, 2, 3);

这还算坏吗?我觉得因为我使用的是单个分区(genre_id),所以IN子句不应该被认为对性能有害。

2 个答案:

答案 0 :(得分:2)

单个分区IN查询被视为好
因为你告诉cassandra哪个节点有你的数据,所以Cassandra只需要查询该节点并使用你的in子句进行过滤。

尝试使in子句保持较小,因为所有过滤都将在单个节点中,并且协调器节点将等待完整结果,否则可能导致超时。

答案 1 :(得分:0)

在我看来,这取决于......一般来说,只要你保持你的清单简短(例如10个元素),你就是安全的。

添加更多元素总是会增加查询的执行时间,最终会超时,并且协调器会增加压力(它必须在将所有结果发送到客户端之前存储)。

如果您在IN子句中使用单个值获取的典型记录足够大(例如,您得到一个很长的BLOB),即使是两项IN子句查询也可能会导致您的性能下降。