组合分区键场景下用IN操作符查询是否会导致全表扫描?
Cassandra复合分区键查询问题解答
你创建的表结构如下:
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);
1. 是否可以执行?
可以执行,Cassandra支持这种在分区键上使用IN子句的查询方式。
2. 是否会引发全表扫描?
不会引发全表扫描,也不会因此带来性能问题。
原因是:复合分区键(group_id, user_id)的每个组合对应一个明确的分区。查询中指定了group_id="A",同时通过IN子句给出多个user_id值,Cassandra会直接定位到每个("A", user_id)对应的分区,分别读取数据后合并结果返回。这种方式本质是多次精准的分区查找,和单独查询每个分区的性能相近。
需要注意的是,IN子句中user_id的数量不宜过多(Cassandra默认对这类查询有数量限制,建议不超过100个),否则可能导致协调器节点压力过大或请求数据量超标,但这不属于全表扫描的范畴。
内容的提问来源于stack exchange,提问作者falcon
相关产品推荐
相关产品推荐

