Cassandra有两个主键,使用第二个

时间:2018-03-06 15:00:48

标签: cassandra cassandra-3.0

我在Cassandra中创建了下一个表

create table yyy (
 index1 int,
 index2 int,
 name text,
 primary key ((index1, index2), name)
)

当我只用index1搜索时,完美。很好!

select * from yyy where index1 ...

通过index2购买我无法搜索

ReadFailure:来自服务器的错误:code = 1300 [Replica(s)无法执行read] message =“操作失败 - 收到0个响应和1个失败”info = {'failuress':1,'received_responses':0, 'required_responses':1,'一致性':'ONE'}

如何按index2搜索?

1 个答案:

答案 0 :(得分:1)

与关系数据库相比,Cassandra在查询数据方面的灵活性要低得多。

你所谓的index1index2实际上在Cassandra中被称为复合分区键。要使用WHERE子句,必须始终提供整个分区键。

例如,这些查询将成功:

SELECT * FROM yyy WHERE index1 = 1 AND index2 = 2;

SELECT * FROM yyy WHERE index1 = 1 AND index2 = 2 AND name = 'fred';

但这些查询都会失败:

SELECT * FROM yyy WHERE index1 = 1;

SELECT * FROM yyy WHERE index2 = 2;

SELECT * FROM yyy WHERE index1 = 1 AND name = 'fred';

这是因为Cassandra使用分区键来确定分区将存储在哪个节点上。如果只提供密钥的一半,Cassandra无法分辨哪个节点包含数据。

当为Cassandra进行数据建模时,如果需要某些不能由单个表提供的查询,则通常会对表进行非规范化。例如,如果您需要单独查询index2,则可以使用此模式创建第二个表:

create table zzz (
 index1 int,
 index2 int,
 name text,
 primary key ((index2), index1, name)
)

现在您可以执行SELECT * FROM zzz WHERE index2 = 2;

请注意,在这种情况下,您还需要确保index2分区不会太大。

还有一些其他功能可以允许更灵活的查询,尽管在使用它们之前应该完全理解它们的局限性,因为它们在未按预期使用时会导致显着的性能或操作问题:

如果您是Cassandra的新手,我强烈建议您阅读Cassandra数据建模最佳实践,因为它不像关系数据库那样简单。这里有很多很好的博客和资源 - 谷歌是你的朋友!