查询我想解雇
select * from t1 where c1 > 1000 and c2 > 1Million and c3 > 8Million
表t1的数据模型
create table t1 {
c1 int,
c2 int,
c3 int,
c4 text
}
我应该将哪些列用作分区键,哪些列用作群集键 . c1,c2,c3的值可以在1到10百万之间 .
如果我执行主键((c1,c2,c3)),则值将在群集中传播 . 但是当我在c1,c2,c3列上查询>查询时,Cassandra如何知道要联系哪些节点或者进行完整的分片扫描?
2 回答
它不允许你在没有
ALLOW FILTERING
的情况下进行查询,这使得它可以读取整个数据集,因为它遍及整个集群 . 它会读取所有内容,丢弃不匹配的东西 . 强烈建议永远不要在开发/测试之外使用ALLOW FILTERING
,除非你真的确定你在做什么 .分区键只能用相等的方式过滤,而不能用你所拥有的不等式过滤 . 不等式只能与聚类键一起使用 .
如果您的表没有那么多行,则可以使用存储桶策略 . 使用它,您可以创建一个辅助列作为唯一具有预定义值(例如1)的分区键 .
因为您有一个分区,所以它不适合扩展包含许多行的表 .
如果您有许多行需要分区,那么您必须重新考虑您的策略,并考虑:
在数据中查找某种能够对数据进行分区的键(或键),同时在需要时帮助对其进行过滤 . 然后,您将在上面的示例中将其用作分区键 . 也许对数据进行非规范化可以帮助实现该密钥(例如:创建一个名为Status for Low / Medium / High数字的列,您可以稍后在群集密钥的不等式过滤中更好地过滤) .
计划要由分析框架(如Spark)查询的表(或多个表) . 在分析中,通常需要通过任何列进行查询,具有等式或不等式 .