我用谷歌搜索并发现在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子句不应该被认为对性能有害。
答案 0 :(得分:2)
单个分区IN查询被视为好
因为你告诉cassandra哪个节点有你的数据,所以Cassandra只需要查询该节点并使用你的in子句进行过滤。
尝试使in子句保持较小,因为所有过滤都将在单个节点中,并且协调器节点将等待完整结果,否则可能导致超时。
答案 1 :(得分:0)
在我看来,这取决于......一般来说,只要你保持你的清单简短(例如10个元素),你就是安全的。
添加更多元素总是会增加查询的执行时间,最终会超时,并且协调器会增加压力(它必须在将所有结果发送到客户端之前存储)。
如果您在IN子句中使用单个值获取的典型记录足够大(例如,您得到一个很长的BLOB),即使是两项IN子句查询也可能会导致您的性能下降。