Cassandra 3.2:基于列对列表匹配的表查询问题
在Cassandra 3.2中匹配多组(namespace, name)聚类列的查询方法
我完全懂你说的官方文档括号混乱的糟心情况,确实有时候语法示例写得让人摸不着头脑。针对你的需求,其实用元组(tuple)结合IN条件就能完美解决,而且这是Cassandra推荐的高效查询方式,具体用法我给你理得明明白白:
首先,你的表结构里bucket是分区键,查询时必须指定它——不然就得用ALLOW FILTERING,这会触发全表扫描,生产环境绝对要避开这种操作。而namespace和name是连续的聚类列,正好可以组合成元组来匹配多组目标值。
示例查询语句
假设你要匹配的(namespace, name)对是("analytics", "user_logs")、("storage", "file_metadata")、("streaming", "real_time_data"),并且目标分区的bucket值为5,那么查询语句应该写成这样:
SELECT * FROM dataset WHERE bucket = 5 AND (namespace, name) IN ( ('analytics', 'user_logs'), ('storage', 'file_metadata'), ('streaming', 'real_time_data') );
关键注意事项
- 分区键必须指定:Cassandra的查询是基于分区的,只有指定了
bucket,才能让数据库直接定位到对应的分区,避免低效的全表扫描。 - 元组列顺序要和表定义一致:你表的聚类列顺序是
namespace在前、name在后,所以元组里的元素顺序也必须严格对应,不能反过来写(name, namespace),否则会匹配不到数据。 - IN条件的元素数量限制:Cassandra默认限制
IN条件里最多有64个元素,如果你的匹配组超过这个数,需要修改cassandra.yaml里的in_query_limit参数,但不建议设置过大,否则会增加单查询的负载,影响集群性能。
内容的提问来源于stack exchange,提问作者tjarvstrand
相关产品推荐
相关产品推荐

