cassandra 使用IN()操作符按分区键进行过滤是否会导致全表扫描?

u0njafvf  于 2023-04-11  发布在  Cassandra
关注(0)|答案(2)|浏览(279)

我有一张table:

CREATE TABLE user (
    group_id text,
    user_id uuid,
    creation_date timestamp,
    details text,
    PRIMARY KEY ((group_id, user_id))
)

group_id和user_id一起构成分区键。那么我可以像下面这样查询吗?

SELECT * FROM user
WHERE group_id="A"
AND user_id IN(80115b8d-d0d3-43f9-ae2d-6d873e3c4348, 03164602-9a31-4a05-a3af-56ec0ea74ef6);

这是否会导致完整扫描导致性能问题?

uubf1zoe

uubf1zoe1#

这是否会导致完整扫描导致性能问题?
那么让我们试试这个。如果我将上面的SELECT语句分成两个查询,并使用TRACING ON运行它们,我会得到以下结果(GCP中的3节点集群w/ RF=3):

SELECT * FROM  user WHERE group_id='A' AND user_id=80115b8d-d0d3-43f9-ae2d-6d873e3c4348;

2792微秒

SELECT * FROM  user WHERE group_id='A' AND user_id=03164602-9a31-4a05-a3af-56ec0ea74ef6;

3267微秒

SELECT * FROM  user WHERE group_id='A' AND user_id in(80115b8d-d0d3-43f9-ae2d-6d873e3c4348, 03164602-9a31-4a05-a3af-56ec0ea74ef6);

27047微秒
在查看IN查询的跟踪报告时,它肯定会与集群中的每个节点进行对话。但我认为响应时间的原始差异表明,为每个键组合运行单独的查询的性能要优于IN查询。

guicsvcw

guicsvcw2#

使用IN()操作符过滤多个分区的查询总是执行得更差,因为协调器必须解析请求,才能为列表中的每个项发出单独的请求。
IN()列表中的两个(也许三个)分区对于应用程序来说可能是可以容忍的,但是超过这两个分区就会给请求协调器带来很大的压力。
IN()运算符不是为筛选分区而设计的。唯一推荐的用法是筛选单个分区内的行。
多分区读取是一种分散-聚集的访问模式,它要么(a)表示数据模型不正确,要么(B)表示分析工作负载(不是OLTP)。如果您的应用用例确实需要多分区读取,我们建议执行多个异步请求,这将最大化集群的吞吐量。干杯!

相关问题