Cassandra数据库如何无需Allow Filtering查询两个聚类列的所有行
存在无需使用ALLOW FILTERING的实现方案,核心逻辑是Cassandra的查询必须首先指定分区键才能高效定位数据节点,你需要调整数据模型适配你的查询模式,可选方案如下:
- 方案1:创建以B为分区键的物化视图
你可以基于原有表创建Cassandra物化视图,直接指定视图的分区键为B,聚类列为C和原有分区键A,视图的数据会由Cassandra自动和原表保持同步,不需要你手动维护双写逻辑。
示例创建语句:
之后你就可以直接执行CREATE MATERIALIZED VIEW IF NOT EXISTS table_by_bc AS SELECT * FROM original_table WHERE B IS NOT NULL AND C IS NOT NULL AND A IS NOT NULL PRIMARY KEY (B, C, A);SELECT * FROM table_by_bc WHERE B = ? AND C = ?完成查询,不需要加ALLOW FILTERING。
注意:物化视图会额外占用存储资源,适合写入压力不大、对数据同步及时性要求高的场景 - 方案2:新建独立的查询专用表
你可以单独创建一张专门适配B、C查询的表,分区键设置为B,聚类列为C和A,业务侧写入原表的同时同步写入这张新表,查询时直接查新表即可。
示例建表语句:
注意:该方案需要你自行保证两张表的数据一致性,适合写入逻辑可控、对写入性能要求高的场景CREATE TABLE IF NOT EXISTS table_by_bc ( A <原A字段类型>, B <原B字段类型>, C <原C字段类型>, -- 补充其他原表需要的字段 PRIMARY KEY (B, C, A) ); - 方案3:为B字段创建二级索引(仅适合低基数场景)
如果B字段的基数非常低(比如枚举值只有几个到几十个),你可以为B字段创建二级索引,之后可以直接执行SELECT * FROM original_table WHERE B = ? AND C = ?查询。
注意:如果B字段基数高,二级索引查询会触发多节点扫描,性能极差,不建议使用该方案
内容的提问来源于stack exchange,提问作者Hisoka
相关产品推荐
相关产品推荐

