Cassandra 卡桑德拉有两个主键,使用第二个
我在卡桑德拉创建了下一个表Cassandra 卡桑德拉有两个主键,使用第二个,cassandra,cassandra-3.0,Cassandra,Cassandra 3.0,我在卡桑德拉创建了下一个表 create table yyy ( index1 int, index2 int, name text, primary key ((index1, index2), name) ) 当我只按index1搜索时,完美。很好 select * from yyy where index1 ... 买我不能用索引搜索 ReadFailure:来自服务器的错误:code=1300[副本未能执行读取]message=“操作失败-收到0个响应和1个失败”info={
create table yyy (
index1 int,
index2 int,
name text,
primary key ((index1, index2), name)
)
当我只按index1搜索时,完美。很好
select * from yyy where index1 ...
买我不能用索引搜索
ReadFailure:来自服务器的错误:code=1300[副本未能执行读取]message=“操作失败-收到0个响应和1个失败”info={'failures':1,“收到的\u响应”:0,“必需的\u响应”:1,“一致性”:“一”}
如何通过index2进行搜索?与关系数据库相比,Cassandra在如何查询数据方面要灵活得多 您所称的
index1
和index2
实际上在Cassandra中一起称为复合分区键。为了使用WHERE子句,必须始终提供整个分区键
例如,这些查询将成功:
从yyy中选择*,其中index1=1,index2=2代码>
从yyy中选择*,其中index1=1,index2=2,name='fred'代码>
但这些查询都将失败:
从yyy中选择*其中index1=1代码>
从yyy中选择*其中index2=2代码>
从yyy中选择*,其中index1=1,name='fred'代码>
这是因为Cassandra使用分区键来确定分区将存储在哪个节点上。如果只提供密钥的一半,Cassandra无法判断哪个节点包含数据
在为Cassandra进行数据建模时,如果需要某些查询,而单个表无法提供这些查询,则通常会对表进行非规范化。例如,如果需要单独查询index2,可以使用以下模式创建第二个表:
create table zzz (
index1 int,
index2 int,
name text,
primary key ((index2), index1, name)
)
现在您可以从zzz执行SELECT*,其中index2=2代码>
注意,在这种情况下,您还需要确保index2
分区不会变得太大
还有一些其他功能允许更灵活的查询,尽管您在使用它们之前应该充分了解它们的限制,因为它们在未按预期使用时可能会导致严重的性能或操作问题:
如果您对Cassandra不熟悉,我强烈建议您阅读Cassandra数据建模最佳实践,因为它不像关系数据库那么简单。在这方面有很多好的博客和资源-谷歌是你的朋友 您可以发布返回错误的查询吗?你还创建了二级索引吗?谢谢。如果index1和index2是键,