我刚刚开始使用Cassandra,我正在尝试使用不同的分区和群集密钥创建表,以了解如何以不同方式查询它们。
我用表格的主键创建了一个表 - (a),b,c,其中a是分区键,b,c是聚类键。
查询时我注意到以下查询:
select * from tablename where b=val;
结果:
无法执行此查询,因为它可能涉及数据过滤,因此 可能有不可预测的表现。如果要执行此查询 尽管性能不可预测,但请使用ALLOW FILTERING
使用"允许过滤"得到我想要的东西(即使我听说它对表现有害)。
但是当我运行以下查询时:
select * from tablename where c=val;
它说:
PRIMARY KEY栏" c"不能限制(前一栏" b"不受限制或非EQ关系)
并且没有"允许过滤"选择权。
我的问题 - 为什么所有群集密钥都不一样?与分区键相邻的列b' a'我们可以选择“允许过滤”。它允许在查询列的同时查询它' c'似乎根本不可能(考虑到这个表的布局方式)。
允许过滤获取cassandra扫描所有SSTable并在缺少分区键时从中获取数据,那么为什么我们不能执行相同的列c?
答案 0 :(得分:18)
并不是说聚类键不一样,而是你不能跳过它们。这是因为Cassandra使用群集键来确定分区内的磁盘排序顺序。
要添加到您的示例中,请假设为PRIMARY KEY ((a),b,c,d)
。您只需指定b
或b
和c
即可运行查询(使用ALLOW FILTERING)。但它不允许您指定c
和d
(跳过b
)或b
和d
(跳过c
)。< / p>
作为辅助节点,如果您真的希望只能b
或仅c
进行查询,那么您应该支持那些具有此类设计的其他表格的查询。允许过滤是一种创可贴,在生产Cassandra部署中不应该做任何事情。