Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra 卡桑德拉有两个主键,使用第二个_Cassandra_Cassandra 3.0 - Fatal编程技术网

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是键,